[
    {
        // Hold fans at the given target when a number of fans are missing.
        "name": "fan(s) missing",
        "groups": [
            {
                "name": "fan inventory",
                "interface": "xyz.openbmc_project.Inventory.Item",
                "property": { "name": "Present" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "count_state_before_target",
                "count": 1,
                "state": false,
                "target": 17000
            }
        ]
    },
    {
        // Hold fans at the given target when a number of rotors are nonfunctional.
        "name": "fan rotor(s) faulted",
        "groups": [
            {
                "name": "fan0 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "fan1 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "fan2 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "fan3 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "fan4 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "fan5 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "count_state_before_target",
                "count": 1,
                "state": false,
                "target": 17000
            }
        ]
    },
    {
        // (for the following 6 rules)
        // if a dual-rotor fan becomes non-functional, lock its speed to
        // poweron_target to lock the other rotor to full_speed
        "name": "nonfunc rotor override-0",
        "groups": [
            {
                "name": "fan0 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "override_fan_target",
                "count": 1,
                "state": false,
                "fans": ["fan0"],
                "target": 17000
            }
        ]
    },
    {
        "name": "nonfunc rotor override-1",
        "groups": [
            {
                "name": "fan1 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "override_fan_target",
                "count": 1,
                "state": false,
                "fans": ["fan1"],
                "target": 17000
            }
        ]
    },
    {
        "name": "nonfunc rotor override-2",
        "groups": [
            {
                "name": "fan2 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "override_fan_target",
                "count": 1,
                "state": false,
                "fans": ["fan2"],
                "target": 17000
            }
        ]
    },
    {
        "name": "nonfunc rotor override-3",
        "groups": [
            {
                "name": "fan3 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "override_fan_target",
                "count": 1,
                "state": false,
                "fans": ["fan3"],
                "target": 17000
            }
        ]
    },
    {
        "name": "nonfunc rotor override-4",
        "groups": [
            {
                "name": "fan4 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "override_fan_target",
                "count": 1,
                "state": false,
                "fans": ["fan4"],
                "target": 17000
            }
        ]
    },
    {
        "name": "nonfunc rotor override-5",
        "groups": [
            {
                "name": "fan5 rotor inventory",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "override_fan_target",
                "count": 1,
                "state": false,
                "fans": ["fan5"],
                "target": 17000
            }
        ]
    },
    {
        // Hold fans at the given target when any critical service
        // is not running for 5 seconds.
        "name": "service(s) missing",
        "groups": [
            {
                "name": "fan inventory",
                "interface": "xyz.openbmc_project.Inventory.Item",
                "property": { "name": "Present" }
            },
            {
                "name": "occ objects",
                "interface": "org.open_power.OCC.Status",
                "property": { "name": "OccActive" }
            },
            {
                "name": "nvme temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "planar temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "flett temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "pcie cable card temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "ambient temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "altitude",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "name_has_owner"
            },
            {
                "class": "signal",
                "signal": "name_owner_changed"
            }
        ],
        "actions": [
            {
                "name": "call_actions_based_on_timer",
                "timer": {
                    "interval": 5000000,
                    "type": "oneshot"
                },
                "actions": [
                    {
                        "name": "set_target_on_missing_owner",
                        "groups": [
                            {
                                "name": "fan inventory",
                                "interface": "xyz.openbmc_project.Inventory.Item",
                                "property": { "name": "Present" }
                            },
                            {
                                "name": "occ objects",
                                "interface": "org.open_power.OCC.Status",
                                "property": { "name": "OccActive" }
                            },
                            {
                                "name": "nvme temps",
                                "interface": "xyz.openbmc_project.Sensor.Value",
                                "property": { "name": "Value" }
                            },
                            {
                                "name": "planar temps",
                                "interface": "xyz.openbmc_project.Sensor.Value",
                                "property": { "name": "Value" }
                            },
                            {
                                "name": "flett temps",
                                "interface": "xyz.openbmc_project.Sensor.Value",
                                "property": { "name": "Value" }
                            },
                            {
                                "name": "pcie cable card temps",
                                "interface": "xyz.openbmc_project.Sensor.Value",
                                "property": { "name": "Value" }
                            },
                            {
                                "name": "ambient temp",
                                "interface": "xyz.openbmc_project.Sensor.Value",
                                "property": { "name": "Value" }
                            }
                        ],
                        "target": 17000
                    }
                ]
            }
        ]
    },
    {
        // Set a fan floor if an OCC isn't active
        "name": "Non-active OCCs",
        "groups": [
            {
                "name": "occ objects",
                "interface": "org.open_power.OCC.Status",
                "property": {
                    "name": "OccActive"
                }
            }
        ],
        "triggers": [
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "init",
                "method": "get_properties"
            }
        ],
        "actions": [
            {
                "name": "count_state_floor",
                "count": 1,
                "state": false,
                "floor": 17000
            }
        ]
    },
    {
        // Set a raised fan floor when any temperature or altitude sensor is
        // nonfunctional
        "name": "Nonfunctional temperature sensors",
        "groups": [
            {
                "name": "proc0 core temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "proc1 core temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "proc2 core temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "proc3 core temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "proc0 ioring temp",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "proc1 ioring temp",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "proc2 ioring temp",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "proc3 ioring temp",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "dram temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "pmic temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "internal memory buffer temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "dram and external memory buffer temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "external memory buffer temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "vdd vrm temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "nvme temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "planar temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "flett temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "pcie cable card temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "ambient temp",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            },
            {
                "name": "altitude",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "signal",
                "signal": "interfaces_removed"
            },
            {
                "class": "init",
                "method": "get_properties"
            }
        ],
        "actions": [
            {
                "name": "count_state_floor",
                "count": 1,
                "state": false,
                "delay": 5,
                "floor": 17000
            }
        ]
    },
    {
        "name": "Set Proc 0 Core DVFS parameter",
        "groups": [
            {
                "name": "proc 0 core dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_0_core_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_0_core_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set Proc 1 Core DVFS parameter",
        "groups": [
            {
                "name": "proc 1 core dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_1_core_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_1_core_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set Proc 2 Core DVFS parameter",
        "groups": [
            {
                "name": "proc 2 core dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_2_core_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_2_core_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set Proc 3 Core DVFS parameter",
        "groups": [
            {
                "name": "proc 3 core dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_3_core_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_3_core_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set Proc 0 IO Ring DVFS parameter",
        "groups": [
            {
                "name": "proc 0 ioring dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_0_ioring_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_0_ioring_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set Proc 1 IO Ring DVFS parameter",
        "groups": [
            {
                "name": "proc 1 ioring dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_1_ioring_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_1_ioring_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set Proc 2 IO Ring DVFS parameter",
        "groups": [
            {
                "name": "proc 2 ioring dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_2_ioring_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_2_ioring_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set Proc 3 IO Ring DVFS parameter",
        "groups": [
            {
                "name": "proc 3 ioring dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_3_ioring_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "proc_3_ioring_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set DRAM DVFS parameter",
        "groups": [
            {
                "name": "dram dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "dram_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 9
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "dram_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 12
                }
            }
        ]
    },
    {
        "name": "Set PMIC DVFS parameter",
        "groups": [
            {
                "name": "pmic dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "pmic_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 9
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "pmic_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 12
                }
            }
        ]
    },
    {
        "name": "Set internal memory buffer DVFS parameter",
        "groups": [
            {
                "name": "internal memory buffer dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "intmb_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "intmb_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set DRAM and external memory buffer DVFS parameter",
        "groups": [
            {
                "name": "dram and external memory buffer dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "dram_extmb_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "dram_extmb_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        "name": "Set external memory buffer DVFS parameter",
        "groups": [
            {
                "name": "external memory buffer dvfs temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "extmb_dvfs_increase_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 10
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "extmb_dvfs_decrease_temp",
                "modifier": {
                    "operator": "minus",
                    "value": 13
                }
            }
        ]
    },
    {
        // Collect group temperatures each iteration the repeating timer expires
        "name": "Fan control timer loop",
        "groups": [
            {
                "name": "proc0 core temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "proc1 core temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "proc2 core temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "proc3 core temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "proc0 ioring temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "proc1 ioring temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "proc2 ioring temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "proc3 ioring temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "dram temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "pmic temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "internal memory buffer temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "dram and external memory buffer temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "external memory buffer temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "vdd vrm temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "nvme temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "planar temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "flett temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "pcie cable card temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "timer",
                "type": "repeating",
                "interval": 2000000,
                "preload_groups": true
            }
        ],
        "actions": [
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "proc0 core temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_0_core_dvfs_increase_temp",
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "proc1 core temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_1_core_dvfs_increase_temp",
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "proc2 core temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_2_core_dvfs_increase_temp",
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "proc3 core temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_3_core_dvfs_increase_temp",
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "proc0 ioring temp",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_0_ioring_dvfs_increase_temp",
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "proc1 ioring temp",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_1_ioring_dvfs_increase_temp",
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "proc2 ioring temp",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_2_ioring_dvfs_increase_temp",
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "proc3 ioring temp",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_3_ioring_dvfs_increase_temp",
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "dram temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "dram_dvfs_increase_temp",
                "delta": 100
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "pmic temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "pmic_dvfs_increase_temp",
                "delta": 100
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "internal memory buffer temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "intmb_dvfs_increase_temp",
                "delta": 100
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "dram and external memory buffer temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "dram_extmb_dvfs_increase_temp",
                "delta": 200
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "external memory buffer temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "extmb_dvfs_increase_temp",
                "delta": 200
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "vdd vrm temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 82.0,
                "delta": 300
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "nvme temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 58.0,
                "delta": 200
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "planar temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 65.0,
                "delta": 255
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "flett temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 80.0,
                "delta": 200
            },
            {
                "name": "set_net_increase_target",
                "groups": [
                    {
                        "name": "pcie cable card temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 70.0,
                "delta": 255
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "proc0 core temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_0_core_dvfs_decrease_temp",
                "delta": 50
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "proc1 core temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_1_core_dvfs_decrease_temp",
                "delta": 50
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "proc2 core temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_2_core_dvfs_decrease_temp",
                "delta": 50
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "proc3 core temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_3_core_dvfs_decrease_temp",
                "delta": 50
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "proc0 ioring temp",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_0_ioring_dvfs_decrease_temp",
                "delta": 50
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "proc1 ioring temp",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_1_ioring_dvfs_decrease_temp",
                "delta": 50
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "proc2 ioring temp",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_2_ioring_dvfs_decrease_temp",
                "delta": 50
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "proc3 ioring temp",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "proc_3_ioring_dvfs_decrease_temp",
                "delta": 50
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "dram temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "dram_dvfs_decrease_temp",
                "delta": 40
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "pmic temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "pmic_dvfs_decrease_temp",
                "delta": 40
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "internal memory buffer temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "intmb_dvfs_decrease_temp",
                "delta": 40
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "dram and external memory buffer temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "dram_extmb_dvfs_decrease_temp",
                "delta": 40
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "external memory buffer temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state_parameter_name": "extmb_dvfs_decrease_temp",
                "delta": 40
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "vdd vrm temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 79.0,
                "delta": 30
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "nvme temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 55.0,
                "delta": 40
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "planar temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 60.0,
                "delta": 80
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "flett temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 75.0,
                "delta": 80
            },
            {
                "name": "set_net_decrease_target",
                "groups": [
                    {
                        "name": "pcie cable card temps",
                        "interface": "xyz.openbmc_project.Sensor.Value",
                        "property": { "name": "Value" }
                    }
                ],
                "state": 65.0,
                "delta": 80
            }
        ]
    },
    {
        // Remove NVMe temperature objects from cache when they are removed from
        // dbus. There's no need to react to their removal.
        "name": "remove nvme objects",
        "groups": [
            {
                "name": "nvme temps",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            },
            {
                "name": "nvme temps",
                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
                "property": { "name": "Functional" }
            }
        ],
        "triggers": [
            {
                "class": "signal",
                "signal": "interfaces_removed"
            }
        ]
    },
    {
        "name": "set pcie floor index",
        "groups": [
            {
                "name": "pcie slots",
                "interface": "xyz.openbmc_project.State.Decorator.PowerState",
                "property": {
                    "name": "PowerState"
                }
            },
            {
                "name": "pcie cards",
                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
                "property": {
                    "name": "Function0DeviceId"
                }
            },
            {
                "name": "pcie cards",
                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
                "property": {
                    "name": "Function0VendorId"
                }
            },
            {
                "name": "pcie cards",
                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
                "property": {
                    "name": "Function0SubsystemId"
                }
            },
            {
                "name": "pcie cards",
                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
                "property": {
                    "name": "Function0SubsystemVendorId"
                }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            }
        ],
        "actions": [
            {
                "name": "pcie_card_floors",
                "use_config_specific_files": true,
                "settle_time": 2
            }
        ]
    },
    {
        "name": "Set altitude offset parameter",
        "groups": [
            {
                "name": "altitude",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                // Refresh altitude every 24hrs
                "class": "timer",
                "type": "repeating",
                "interval": 86400000000,
                "preload_groups": true
            }
        ],
        "actions": [
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "ambient_20_altitude_offset",
                "modifier": {
                    "operator": "less_than",
                    "default_value": 10000,
                    "value": [
                        { "arg_value": 500, "parameter_value": 0 },
                        { "arg_value": 1000, "parameter_value": 700 },
                        { "arg_value": 1500, "parameter_value": 1600 },
                        { "arg_value": 2000, "parameter_value": 2300 },
                        { "arg_value": 2500, "parameter_value": 3200 },
                        { "arg_value": 3300, "parameter_value": 4000 }
                    ]
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "ambient_25_altitude_offset",
                "modifier": {
                    "operator": "less_than",
                    "default_value": 10000,
                    "value": [
                        { "arg_value": 500, "parameter_value": 0 },
                        { "arg_value": 1000, "parameter_value": 1000 },
                        { "arg_value": 1500, "parameter_value": 2100 },
                        { "arg_value": 2000, "parameter_value": 3100 },
                        { "arg_value": 2500, "parameter_value": 4100 },
                        { "arg_value": 3300, "parameter_value": 4900 }
                    ]
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "ambient_30_altitude_offset",
                "modifier": {
                    "operator": "less_than",
                    "default_value": 10000,
                    "value": [
                        { "arg_value": 500, "parameter_value": 0 },
                        { "arg_value": 1000, "parameter_value": 1000 },
                        { "arg_value": 1500, "parameter_value": 2100 },
                        { "arg_value": 2000, "parameter_value": 3200 },
                        { "arg_value": 2500, "parameter_value": 4000 },
                        { "arg_value": 3300, "parameter_value": 4800 }
                    ]
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "ambient_35_altitude_offset",
                "modifier": {
                    "operator": "less_than",
                    "default_value": 10000,
                    "value": [
                        { "arg_value": 500, "parameter_value": 0 },
                        { "arg_value": 1000, "parameter_value": 900 },
                        { "arg_value": 1500, "parameter_value": 1700 },
                        { "arg_value": 2000, "parameter_value": 2500 },
                        { "arg_value": 2500, "parameter_value": 3400 },
                        { "arg_value": 3300, "parameter_value": 4200 }
                    ]
                }
            },
            {
                "name": "set_parameter_from_group_max",
                "parameter_name": "ambient_40_altitude_offset",
                "modifier": {
                    "operator": "less_than",
                    "default_value": 10000,
                    "value": [
                        { "arg_value": 500, "parameter_value": 0 },
                        { "arg_value": 1000, "parameter_value": 1000 },
                        { "arg_value": 1500, "parameter_value": 1900 },
                        { "arg_value": 2000, "parameter_value": 2800 },
                        { "arg_value": 2500, "parameter_value": 3700 },
                        { "arg_value": 3300, "parameter_value": 4500 }
                    ]
                }
            }
        ]
    },
    {
        "name": "Fan floors",
        "groups": [
            {
                "name": "ambient temp",
                "interface": "xyz.openbmc_project.Sensor.Value",
                "property": { "name": "Value" }
            }
        ],
        "triggers": [
            {
                "class": "init",
                "method": "get_properties"
            },
            {
                "class": "signal",
                "signal": "properties_changed"
            },
            {
                "class": "signal",
                "signal": "interfaces_added"
            },
            {
                "class": "parameter",
                "parameter": "pcie_floor_index"
            },
            {
                "class": "parameter",
                "parameter": "ambient_20_altitude_offset"
            },
            {
                "class": "parameter",
                "parameter": "ambient_25_altitude_offset"
            },
            {
                "class": "parameter",
                "parameter": "ambient_30_altitude_offset"
            },
            {
                "class": "parameter",
                "parameter": "ambient_35_altitude_offset"
            },
            {
                "class": "parameter",
                "parameter": "ambient_40_altitude_offset"
            }
        ],
        "actions": [
            {
                "name": "mapped_floor",
                "key_group": "ambient temp",
                "fan_floors": [
                    {
                        // Entry valid for temps < 20
                        "key": 20,
                        "default_floor": 5400,
                        "floor_offset_parameter": "ambient_20_altitude_offset",
                        "floors": [
                            {
                                "parameter": "pcie_floor_index",
                                "floors": [
                                    { "value": 1, "floor": 5600 },
                                    { "value": 2, "floor": 9000 },
                                    { "value": 3, "floor": 9000 },
                                    { "value": 4, "floor": 9200 },
                                    { "value": 5, "floor": 10600 }
                                ]
                            }
                        ]
                    },
                    {
                        // Entry valid for temps < 25
                        "key": 25,
                        "default_floor": 7300,
                        "floor_offset_parameter": "ambient_25_altitude_offset",
                        "floors": [
                            {
                                "parameter": "pcie_floor_index",
                                "floors": [
                                    { "value": 1, "floor": 7800 },
                                    { "value": 2, "floor": 10700 },
                                    { "value": 3, "floor": 11300 },
                                    { "value": 4, "floor": 12700 },
                                    { "value": 5, "floor": 13900 }
                                ]
                            }
                        ]
                    },
                    {
                        // Entry valid for temps < 30
                        "key": 30,
                        "default_floor": 9100,
                        "floor_offset_parameter": "ambient_30_altitude_offset",
                        "floors": [
                            {
                                "parameter": "pcie_floor_index",
                                "floors": [
                                    { "value": 1, "floor": 10300 },
                                    { "value": 2, "floor": 12100 },
                                    { "value": 3, "floor": 14400 },
                                    { "value": 4, "floor": 16300 },
                                    { "value": 5, "floor": 17000 }
                                ]
                            }
                        ]
                    },
                    {
                        // Entry valid for temps < 35
                        "key": 35,
                        "default_floor": 10800,
                        "floor_offset_parameter": "ambient_35_altitude_offset",
                        "floors": [
                            {
                                "parameter": "pcie_floor_index",
                                "floors": [
                                    { "value": 1, "floor": 12700 },
                                    { "value": 2, "floor": 13500 },
                                    { "value": 3, "floor": 17000 },
                                    { "value": 4, "floor": 17000 },
                                    { "value": 5, "floor": 17000 }
                                ]
                            }
                        ]
                    },
                    {
                        // Entry valid for temps < 40
                        "key": 40,
                        "default_floor": 12600,
                        "floor_offset_parameter": "ambient_40_altitude_offset",
                        "floors": [
                            {
                                "parameter": "pcie_floor_index",
                                "floors": [
                                    { "value": 1, "floor": 15000 },
                                    { "value": 2, "floor": 15500 },
                                    { "value": 3, "floor": 17000 },
                                    { "value": 4, "floor": 17000 },
                                    { "value": 5, "floor": 17000 }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
]