1[
2    {
3        // Hold fans at the given target when a number of fans are missing.
4        "name": "fan(s) missing",
5        "groups": [
6            {
7                "name": "fan inventory",
8                "interface": "xyz.openbmc_project.Inventory.Item",
9                "property": { "name": "Present" }
10            }
11        ],
12        "triggers": [
13            {
14                "class": "init",
15                "method": "get_properties"
16            },
17            {
18                "class": "signal",
19                "signal": "properties_changed"
20            }
21        ],
22        "actions": [
23            {
24                "name": "count_state_before_target",
25                "count": 1,
26                "state": false,
27                "target": 18000
28            }
29        ]
30    },
31    {
32        // Hold fans at the given target when a number of rotors are nonfunctional.
33        "name": "fan rotor(s) faulted",
34        "groups": [
35            {
36                "name": "fan0 rotor inventory",
37                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
38                "property": { "name": "Functional" }
39            },
40            {
41                "name": "fan1 rotor inventory",
42                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
43                "property": { "name": "Functional" }
44            },
45            {
46                "name": "fan2 rotor inventory",
47                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
48                "property": { "name": "Functional" }
49            },
50            {
51                "name": "fan3 rotor inventory",
52                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
53                "property": { "name": "Functional" }
54            },
55            {
56                "name": "fan4 rotor inventory",
57                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
58                "property": { "name": "Functional" }
59            },
60            {
61                "name": "fan5 rotor inventory",
62                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
63                "property": { "name": "Functional" }
64            }
65        ],
66        "triggers": [
67            {
68                "class": "init",
69                "method": "get_properties"
70            },
71            {
72                "class": "signal",
73                "signal": "properties_changed"
74            }
75        ],
76        "actions": [
77            {
78                "name": "count_state_before_target",
79                "count": 1,
80                "state": false,
81                "target": 18000
82            }
83        ]
84    },
85    {
86        // (for the following 6 rules)
87        // if a dual-rotor fan becomes non-functional, lock its speed to
88        // poweron_target to lock the other rotor to full_speed
89        "name": "nonfunc rotor override-0",
90        "groups": [
91            {
92                "name": "fan0 rotor inventory",
93                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
94                "property": { "name": "Functional" }
95            }
96        ],
97        "triggers": [
98            {
99                "class": "init",
100                "method": "get_properties"
101            },
102            {
103                "class": "signal",
104                "signal": "properties_changed"
105            }
106        ],
107        "actions": [
108            {
109                "name": "override_fan_target",
110                "count": 1,
111                "state": false,
112                "fans": ["fan0"],
113                "target": 18000
114            }
115        ]
116    },
117    {
118        "name": "nonfunc rotor override-1",
119        "groups": [
120            {
121                "name": "fan1 rotor inventory",
122                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
123                "property": { "name": "Functional" }
124            }
125        ],
126        "triggers": [
127            {
128                "class": "init",
129                "method": "get_properties"
130            },
131            {
132                "class": "signal",
133                "signal": "properties_changed"
134            }
135        ],
136        "actions": [
137            {
138                "name": "override_fan_target",
139                "count": 1,
140                "state": false,
141                "fans": ["fan1"],
142                "target": 18000
143            }
144        ]
145    },
146    {
147        "name": "nonfunc rotor override-2",
148        "groups": [
149            {
150                "name": "fan2 rotor inventory",
151                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
152                "property": { "name": "Functional" }
153            }
154        ],
155        "triggers": [
156            {
157                "class": "init",
158                "method": "get_properties"
159            },
160            {
161                "class": "signal",
162                "signal": "properties_changed"
163            }
164        ],
165        "actions": [
166            {
167                "name": "override_fan_target",
168                "count": 1,
169                "state": false,
170                "fans": ["fan2"],
171                "target": 18000
172            }
173        ]
174    },
175    {
176        "name": "nonfunc rotor override-3",
177        "groups": [
178            {
179                "name": "fan3 rotor inventory",
180                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
181                "property": { "name": "Functional" }
182            }
183        ],
184        "triggers": [
185            {
186                "class": "init",
187                "method": "get_properties"
188            },
189            {
190                "class": "signal",
191                "signal": "properties_changed"
192            }
193        ],
194        "actions": [
195            {
196                "name": "override_fan_target",
197                "count": 1,
198                "state": false,
199                "fans": ["fan3"],
200                "target": 18000
201            }
202        ]
203    },
204    {
205        "name": "nonfunc rotor override-4",
206        "groups": [
207            {
208                "name": "fan4 rotor inventory",
209                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
210                "property": { "name": "Functional" }
211            }
212        ],
213        "triggers": [
214            {
215                "class": "init",
216                "method": "get_properties"
217            },
218            {
219                "class": "signal",
220                "signal": "properties_changed"
221            }
222        ],
223        "actions": [
224            {
225                "name": "override_fan_target",
226                "count": 1,
227                "state": false,
228                "fans": ["fan4"],
229                "target": 18000
230            }
231        ]
232    },
233    {
234        "name": "nonfunc rotor override-5",
235        "groups": [
236            {
237                "name": "fan5 rotor inventory",
238                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
239                "property": { "name": "Functional" }
240            }
241        ],
242        "triggers": [
243            {
244                "class": "init",
245                "method": "get_properties"
246            },
247            {
248                "class": "signal",
249                "signal": "properties_changed"
250            }
251        ],
252        "actions": [
253            {
254                "name": "override_fan_target",
255                "count": 1,
256                "state": false,
257                "fans": ["fan5"],
258                "target": 18000
259            }
260        ]
261    },
262    {
263        // Hold fans at the given target when any critical service
264        // is not running for 5 seconds.
265        "name": "service(s) missing",
266        "groups": [
267            {
268                "name": "fan inventory",
269                "interface": "xyz.openbmc_project.Inventory.Item",
270                "property": { "name": "Present" }
271            },
272            {
273                "name": "occ objects",
274                "interface": "org.open_power.OCC.Status",
275                "property": { "name": "OccActive" }
276            },
277            {
278                "name": "nvme temps",
279                "interface": "xyz.openbmc_project.Sensor.Value",
280                "property": { "name": "Value" }
281            },
282            {
283                "name": "planar temps",
284                "interface": "xyz.openbmc_project.Sensor.Value",
285                "property": { "name": "Value" }
286            },
287            {
288                "name": "flett temps",
289                "interface": "xyz.openbmc_project.Sensor.Value",
290                "property": { "name": "Value" }
291            },
292            {
293                "name": "pcie cable card temps",
294                "interface": "xyz.openbmc_project.Sensor.Value",
295                "property": { "name": "Value" }
296            },
297            {
298                "name": "ambient temp",
299                "interface": "xyz.openbmc_project.Sensor.Value",
300                "property": { "name": "Value" }
301            },
302            {
303                "name": "altitude",
304                "interface": "xyz.openbmc_project.Sensor.Value",
305                "property": { "name": "Value" }
306            }
307        ],
308        "triggers": [
309            {
310                "class": "init",
311                "method": "name_has_owner"
312            },
313            {
314                "class": "signal",
315                "signal": "name_owner_changed"
316            }
317        ],
318        "actions": [
319            {
320                "name": "call_actions_based_on_timer",
321                "timer": {
322                    "interval": 5000000,
323                    "type": "oneshot"
324                },
325                "actions": [
326                    {
327                        "name": "set_target_on_missing_owner",
328                        "groups": [
329                            {
330                                "name": "fan inventory",
331                                "interface": "xyz.openbmc_project.Inventory.Item",
332                                "property": { "name": "Present" }
333                            },
334                            {
335                                "name": "occ objects",
336                                "interface": "org.open_power.OCC.Status",
337                                "property": { "name": "OccActive" }
338                            },
339                            {
340                                "name": "nvme temps",
341                                "interface": "xyz.openbmc_project.Sensor.Value",
342                                "property": { "name": "Value" }
343                            },
344                            {
345                                "name": "planar temps",
346                                "interface": "xyz.openbmc_project.Sensor.Value",
347                                "property": { "name": "Value" }
348                            },
349                            {
350                                "name": "flett temps",
351                                "interface": "xyz.openbmc_project.Sensor.Value",
352                                "property": { "name": "Value" }
353                            },
354                            {
355                                "name": "pcie cable card temps",
356                                "interface": "xyz.openbmc_project.Sensor.Value",
357                                "property": { "name": "Value" }
358                            },
359                            {
360                                "name": "ambient temp",
361                                "interface": "xyz.openbmc_project.Sensor.Value",
362                                "property": { "name": "Value" }
363                            }
364                        ],
365                        "target": 18000
366                    }
367                ]
368            }
369        ]
370    },
371    {
372        // Set a fan floor if an OCC isn't active
373        "name": "Non-active OCCs",
374        "groups": [
375            {
376                "name": "occ objects",
377                "interface": "org.open_power.OCC.Status",
378                "property": {
379                    "name": "OccActive"
380                }
381            }
382        ],
383        "triggers": [
384            {
385                "class": "signal",
386                "signal": "properties_changed"
387            },
388            {
389                "class": "signal",
390                "signal": "interfaces_added"
391            },
392            {
393                "class": "init",
394                "method": "get_properties"
395            }
396        ],
397        "actions": [
398            {
399                "name": "count_state_floor",
400                "count": 1,
401                "state": false,
402                "floor": 18000
403            }
404        ]
405    },
406    {
407        // Set a raised fan floor when any temperature or altitude sensor is
408        // nonfunctional
409        "name": "Nonfunctional temperature sensors",
410        "groups": [
411            {
412                "name": "proc0 core temps",
413                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
414                "property": { "name": "Functional" }
415            },
416            {
417                "name": "proc1 core temps",
418                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
419                "property": { "name": "Functional" }
420            },
421            {
422                "name": "proc2 core temps",
423                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
424                "property": { "name": "Functional" }
425            },
426            {
427                "name": "proc3 core temps",
428                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
429                "property": { "name": "Functional" }
430            },
431            {
432                "name": "proc0 ioring temp",
433                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
434                "property": { "name": "Functional" }
435            },
436            {
437                "name": "proc1 ioring temp",
438                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
439                "property": { "name": "Functional" }
440            },
441            {
442                "name": "proc2 ioring temp",
443                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
444                "property": { "name": "Functional" }
445            },
446            {
447                "name": "proc3 ioring temp",
448                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
449                "property": { "name": "Functional" }
450            },
451            {
452                "name": "dram temps",
453                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
454                "property": { "name": "Functional" }
455            },
456            {
457                "name": "pmic temps",
458                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
459                "property": { "name": "Functional" }
460            },
461            {
462                "name": "internal memory buffer temps",
463                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
464                "property": { "name": "Functional" }
465            },
466            {
467                "name": "dram and external memory buffer temps",
468                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
469                "property": { "name": "Functional" }
470            },
471            {
472                "name": "external memory buffer temps",
473                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
474                "property": { "name": "Functional" }
475            },
476            {
477                "name": "vdd vrm temps",
478                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
479                "property": { "name": "Functional" }
480            },
481            {
482                "name": "nvme temps",
483                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
484                "property": { "name": "Functional" }
485            },
486            {
487                "name": "planar temps",
488                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
489                "property": { "name": "Functional" }
490            },
491            {
492                "name": "flett temps",
493                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
494                "property": { "name": "Functional" }
495            },
496            {
497                "name": "pcie cable card temps",
498                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
499                "property": { "name": "Functional" }
500            },
501            {
502                "name": "ambient temp",
503                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
504                "property": { "name": "Functional" }
505            },
506            {
507                "name": "altitude",
508                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
509                "property": { "name": "Functional" }
510            }
511        ],
512        "triggers": [
513            {
514                "class": "signal",
515                "signal": "properties_changed"
516            },
517            {
518                "class": "signal",
519                "signal": "interfaces_added"
520            },
521            {
522                "class": "signal",
523                "signal": "interfaces_removed"
524            },
525            {
526                "class": "init",
527                "method": "get_properties"
528            }
529        ],
530        "actions": [
531            {
532                "name": "count_state_floor",
533                "count": 1,
534                "state": false,
535                "delay": 5,
536                "floor": 18000
537            }
538        ]
539    },
540    {
541        "name": "Set Proc 0 Core DVFS parameter",
542        "groups": [
543            {
544                "name": "proc 0 core dvfs temp",
545                "interface": "xyz.openbmc_project.Sensor.Value",
546                "property": { "name": "Value" }
547            }
548        ],
549        "triggers": [
550            {
551                "class": "init",
552                "method": "get_properties"
553            },
554            {
555                "class": "signal",
556                "signal": "interfaces_added"
557            },
558            {
559                "class": "signal",
560                "signal": "properties_changed"
561            }
562        ],
563        "actions": [
564            {
565                "name": "set_parameter_from_group_max",
566                "parameter_name": "proc_0_core_dvfs_increase_temp",
567                "modifier": {
568                    "operator": "minus",
569                    "value": 10
570                }
571            },
572            {
573                "name": "set_parameter_from_group_max",
574                "parameter_name": "proc_0_core_dvfs_decrease_temp",
575                "modifier": {
576                    "operator": "minus",
577                    "value": 13
578                }
579            }
580        ]
581    },
582    {
583        "name": "Set Proc 1 Core DVFS parameter",
584        "groups": [
585            {
586                "name": "proc 1 core dvfs temp",
587                "interface": "xyz.openbmc_project.Sensor.Value",
588                "property": { "name": "Value" }
589            }
590        ],
591        "triggers": [
592            {
593                "class": "init",
594                "method": "get_properties"
595            },
596            {
597                "class": "signal",
598                "signal": "interfaces_added"
599            },
600            {
601                "class": "signal",
602                "signal": "properties_changed"
603            }
604        ],
605        "actions": [
606            {
607                "name": "set_parameter_from_group_max",
608                "parameter_name": "proc_1_core_dvfs_increase_temp",
609                "modifier": {
610                    "operator": "minus",
611                    "value": 10
612                }
613            },
614            {
615                "name": "set_parameter_from_group_max",
616                "parameter_name": "proc_1_core_dvfs_decrease_temp",
617                "modifier": {
618                    "operator": "minus",
619                    "value": 13
620                }
621            }
622        ]
623    },
624    {
625        "name": "Set Proc 2 Core DVFS parameter",
626        "groups": [
627            {
628                "name": "proc 2 core dvfs temp",
629                "interface": "xyz.openbmc_project.Sensor.Value",
630                "property": { "name": "Value" }
631            }
632        ],
633        "triggers": [
634            {
635                "class": "init",
636                "method": "get_properties"
637            },
638            {
639                "class": "signal",
640                "signal": "interfaces_added"
641            },
642            {
643                "class": "signal",
644                "signal": "properties_changed"
645            }
646        ],
647        "actions": [
648            {
649                "name": "set_parameter_from_group_max",
650                "parameter_name": "proc_2_core_dvfs_increase_temp",
651                "modifier": {
652                    "operator": "minus",
653                    "value": 10
654                }
655            },
656            {
657                "name": "set_parameter_from_group_max",
658                "parameter_name": "proc_2_core_dvfs_decrease_temp",
659                "modifier": {
660                    "operator": "minus",
661                    "value": 13
662                }
663            }
664        ]
665    },
666    {
667        "name": "Set Proc 3 Core DVFS parameter",
668        "groups": [
669            {
670                "name": "proc 3 core dvfs temp",
671                "interface": "xyz.openbmc_project.Sensor.Value",
672                "property": { "name": "Value" }
673            }
674        ],
675        "triggers": [
676            {
677                "class": "init",
678                "method": "get_properties"
679            },
680            {
681                "class": "signal",
682                "signal": "interfaces_added"
683            },
684            {
685                "class": "signal",
686                "signal": "properties_changed"
687            }
688        ],
689        "actions": [
690            {
691                "name": "set_parameter_from_group_max",
692                "parameter_name": "proc_3_core_dvfs_increase_temp",
693                "modifier": {
694                    "operator": "minus",
695                    "value": 10
696                }
697            },
698            {
699                "name": "set_parameter_from_group_max",
700                "parameter_name": "proc_3_core_dvfs_decrease_temp",
701                "modifier": {
702                    "operator": "minus",
703                    "value": 13
704                }
705            }
706        ]
707    },
708    {
709        "name": "Set Proc 0 IO Ring DVFS parameter",
710        "groups": [
711            {
712                "name": "proc 0 ioring dvfs temp",
713                "interface": "xyz.openbmc_project.Sensor.Value",
714                "property": { "name": "Value" }
715            }
716        ],
717        "triggers": [
718            {
719                "class": "init",
720                "method": "get_properties"
721            },
722            {
723                "class": "signal",
724                "signal": "interfaces_added"
725            },
726            {
727                "class": "signal",
728                "signal": "properties_changed"
729            }
730        ],
731        "actions": [
732            {
733                "name": "set_parameter_from_group_max",
734                "parameter_name": "proc_0_ioring_dvfs_increase_temp",
735                "modifier": {
736                    "operator": "minus",
737                    "value": 10
738                }
739            },
740            {
741                "name": "set_parameter_from_group_max",
742                "parameter_name": "proc_0_ioring_dvfs_decrease_temp",
743                "modifier": {
744                    "operator": "minus",
745                    "value": 13
746                }
747            }
748        ]
749    },
750    {
751        "name": "Set Proc 1 IO Ring DVFS parameter",
752        "groups": [
753            {
754                "name": "proc 1 ioring dvfs temp",
755                "interface": "xyz.openbmc_project.Sensor.Value",
756                "property": { "name": "Value" }
757            }
758        ],
759        "triggers": [
760            {
761                "class": "init",
762                "method": "get_properties"
763            },
764            {
765                "class": "signal",
766                "signal": "interfaces_added"
767            },
768            {
769                "class": "signal",
770                "signal": "properties_changed"
771            }
772        ],
773        "actions": [
774            {
775                "name": "set_parameter_from_group_max",
776                "parameter_name": "proc_1_ioring_dvfs_increase_temp",
777                "modifier": {
778                    "operator": "minus",
779                    "value": 10
780                }
781            },
782            {
783                "name": "set_parameter_from_group_max",
784                "parameter_name": "proc_1_ioring_dvfs_decrease_temp",
785                "modifier": {
786                    "operator": "minus",
787                    "value": 13
788                }
789            }
790        ]
791    },
792    {
793        "name": "Set Proc 2 IO Ring DVFS parameter",
794        "groups": [
795            {
796                "name": "proc 2 ioring dvfs temp",
797                "interface": "xyz.openbmc_project.Sensor.Value",
798                "property": { "name": "Value" }
799            }
800        ],
801        "triggers": [
802            {
803                "class": "init",
804                "method": "get_properties"
805            },
806            {
807                "class": "signal",
808                "signal": "interfaces_added"
809            },
810            {
811                "class": "signal",
812                "signal": "properties_changed"
813            }
814        ],
815        "actions": [
816            {
817                "name": "set_parameter_from_group_max",
818                "parameter_name": "proc_2_ioring_dvfs_increase_temp",
819                "modifier": {
820                    "operator": "minus",
821                    "value": 10
822                }
823            },
824            {
825                "name": "set_parameter_from_group_max",
826                "parameter_name": "proc_2_ioring_dvfs_decrease_temp",
827                "modifier": {
828                    "operator": "minus",
829                    "value": 13
830                }
831            }
832        ]
833    },
834    {
835        "name": "Set Proc 3 IO Ring DVFS parameter",
836        "groups": [
837            {
838                "name": "proc 3 ioring dvfs temp",
839                "interface": "xyz.openbmc_project.Sensor.Value",
840                "property": { "name": "Value" }
841            }
842        ],
843        "triggers": [
844            {
845                "class": "init",
846                "method": "get_properties"
847            },
848            {
849                "class": "signal",
850                "signal": "properties_changed"
851            },
852            {
853                "class": "signal",
854                "signal": "interfaces_added"
855            }
856        ],
857        "actions": [
858            {
859                "name": "set_parameter_from_group_max",
860                "parameter_name": "proc_3_ioring_dvfs_increase_temp",
861                "modifier": {
862                    "operator": "minus",
863                    "value": 10
864                }
865            },
866            {
867                "name": "set_parameter_from_group_max",
868                "parameter_name": "proc_3_ioring_dvfs_decrease_temp",
869                "modifier": {
870                    "operator": "minus",
871                    "value": 13
872                }
873            }
874        ]
875    },
876    {
877        "name": "Set DRAM DVFS parameter",
878        "groups": [
879            {
880                "name": "dram dvfs temp",
881                "interface": "xyz.openbmc_project.Sensor.Value",
882                "property": { "name": "Value" }
883            }
884        ],
885        "triggers": [
886            {
887                "class": "init",
888                "method": "get_properties"
889            },
890            {
891                "class": "signal",
892                "signal": "properties_changed"
893            },
894            {
895                "class": "signal",
896                "signal": "interfaces_added"
897            }
898        ],
899        "actions": [
900            {
901                "name": "set_parameter_from_group_max",
902                "parameter_name": "dram_dvfs_increase_temp",
903                "modifier": {
904                    "operator": "minus",
905                    "value": 9
906                }
907            },
908            {
909                "name": "set_parameter_from_group_max",
910                "parameter_name": "dram_dvfs_decrease_temp",
911                "modifier": {
912                    "operator": "minus",
913                    "value": 12
914                }
915            }
916        ]
917    },
918    {
919        "name": "Set PMIC DVFS parameter",
920        "groups": [
921            {
922                "name": "pmic dvfs temp",
923                "interface": "xyz.openbmc_project.Sensor.Value",
924                "property": { "name": "Value" }
925            }
926        ],
927        "triggers": [
928            {
929                "class": "init",
930                "method": "get_properties"
931            },
932            {
933                "class": "signal",
934                "signal": "properties_changed"
935            },
936            {
937                "class": "signal",
938                "signal": "interfaces_added"
939            }
940        ],
941        "actions": [
942            {
943                "name": "set_parameter_from_group_max",
944                "parameter_name": "pmic_dvfs_increase_temp",
945                "modifier": {
946                    "operator": "minus",
947                    "value": 9
948                }
949            },
950            {
951                "name": "set_parameter_from_group_max",
952                "parameter_name": "pmic_dvfs_decrease_temp",
953                "modifier": {
954                    "operator": "minus",
955                    "value": 12
956                }
957            }
958        ]
959    },
960    {
961        "name": "Set internal memory buffer DVFS parameter",
962        "groups": [
963            {
964                "name": "internal memory buffer dvfs temp",
965                "interface": "xyz.openbmc_project.Sensor.Value",
966                "property": { "name": "Value" }
967            }
968        ],
969        "triggers": [
970            {
971                "class": "init",
972                "method": "get_properties"
973            },
974            {
975                "class": "signal",
976                "signal": "properties_changed"
977            },
978            {
979                "class": "signal",
980                "signal": "interfaces_added"
981            }
982        ],
983        "actions": [
984            {
985                "name": "set_parameter_from_group_max",
986                "parameter_name": "intmb_dvfs_increase_temp",
987                "modifier": {
988                    "operator": "minus",
989                    "value": 10
990                }
991            },
992            {
993                "name": "set_parameter_from_group_max",
994                "parameter_name": "intmb_dvfs_decrease_temp",
995                "modifier": {
996                    "operator": "minus",
997                    "value": 13
998                }
999            }
1000        ]
1001    },
1002    {
1003        "name": "Set DRAM and external memory buffer DVFS parameter",
1004        "groups": [
1005            {
1006                "name": "dram and external memory buffer dvfs temp",
1007                "interface": "xyz.openbmc_project.Sensor.Value",
1008                "property": { "name": "Value" }
1009            }
1010        ],
1011        "triggers": [
1012            {
1013                "class": "init",
1014                "method": "get_properties"
1015            },
1016            {
1017                "class": "signal",
1018                "signal": "properties_changed"
1019            },
1020            {
1021                "class": "signal",
1022                "signal": "interfaces_added"
1023            }
1024        ],
1025        "actions": [
1026            {
1027                "name": "set_parameter_from_group_max",
1028                "parameter_name": "dram_extmb_dvfs_increase_temp",
1029                "modifier": {
1030                    "operator": "minus",
1031                    "value": 10
1032                }
1033            },
1034            {
1035                "name": "set_parameter_from_group_max",
1036                "parameter_name": "dram_extmb_dvfs_decrease_temp",
1037                "modifier": {
1038                    "operator": "minus",
1039                    "value": 13
1040                }
1041            }
1042        ]
1043    },
1044    {
1045        "name": "Set external memory buffer DVFS parameter",
1046        "groups": [
1047            {
1048                "name": "external memory buffer dvfs temp",
1049                "interface": "xyz.openbmc_project.Sensor.Value",
1050                "property": { "name": "Value" }
1051            }
1052        ],
1053        "triggers": [
1054            {
1055                "class": "init",
1056                "method": "get_properties"
1057            },
1058            {
1059                "class": "signal",
1060                "signal": "properties_changed"
1061            },
1062            {
1063                "class": "signal",
1064                "signal": "interfaces_added"
1065            }
1066        ],
1067        "actions": [
1068            {
1069                "name": "set_parameter_from_group_max",
1070                "parameter_name": "extmb_dvfs_increase_temp",
1071                "modifier": {
1072                    "operator": "minus",
1073                    "value": 10
1074                }
1075            },
1076            {
1077                "name": "set_parameter_from_group_max",
1078                "parameter_name": "extmb_dvfs_decrease_temp",
1079                "modifier": {
1080                    "operator": "minus",
1081                    "value": 13
1082                }
1083            }
1084        ]
1085    },
1086    {
1087        // Collect group temperatures each iteration the repeating timer expires
1088        "name": "Fan control timer loop",
1089        "groups": [
1090            {
1091                "name": "proc0 core temps",
1092                "interface": "xyz.openbmc_project.Sensor.Value",
1093                "property": { "name": "Value" }
1094            },
1095            {
1096                "name": "proc1 core temps",
1097                "interface": "xyz.openbmc_project.Sensor.Value",
1098                "property": { "name": "Value" }
1099            },
1100            {
1101                "name": "proc2 core temps",
1102                "interface": "xyz.openbmc_project.Sensor.Value",
1103                "property": { "name": "Value" }
1104            },
1105            {
1106                "name": "proc3 core temps",
1107                "interface": "xyz.openbmc_project.Sensor.Value",
1108                "property": { "name": "Value" }
1109            },
1110            {
1111                "name": "proc0 ioring temp",
1112                "interface": "xyz.openbmc_project.Sensor.Value",
1113                "property": { "name": "Value" }
1114            },
1115            {
1116                "name": "proc1 ioring temp",
1117                "interface": "xyz.openbmc_project.Sensor.Value",
1118                "property": { "name": "Value" }
1119            },
1120            {
1121                "name": "proc2 ioring temp",
1122                "interface": "xyz.openbmc_project.Sensor.Value",
1123                "property": { "name": "Value" }
1124            },
1125            {
1126                "name": "proc3 ioring temp",
1127                "interface": "xyz.openbmc_project.Sensor.Value",
1128                "property": { "name": "Value" }
1129            },
1130            {
1131                "name": "dram temps",
1132                "interface": "xyz.openbmc_project.Sensor.Value",
1133                "property": { "name": "Value" }
1134            },
1135            {
1136                "name": "pmic temps",
1137                "interface": "xyz.openbmc_project.Sensor.Value",
1138                "property": { "name": "Value" }
1139            },
1140            {
1141                "name": "internal memory buffer temps",
1142                "interface": "xyz.openbmc_project.Sensor.Value",
1143                "property": { "name": "Value" }
1144            },
1145            {
1146                "name": "dram and external memory buffer temps",
1147                "interface": "xyz.openbmc_project.Sensor.Value",
1148                "property": { "name": "Value" }
1149            },
1150            {
1151                "name": "external memory buffer temps",
1152                "interface": "xyz.openbmc_project.Sensor.Value",
1153                "property": { "name": "Value" }
1154            },
1155            {
1156                "name": "vdd vrm temps",
1157                "interface": "xyz.openbmc_project.Sensor.Value",
1158                "property": { "name": "Value" }
1159            },
1160            {
1161                "name": "nvme temps",
1162                "interface": "xyz.openbmc_project.Sensor.Value",
1163                "property": { "name": "Value" }
1164            },
1165            {
1166                "name": "planar temps",
1167                "interface": "xyz.openbmc_project.Sensor.Value",
1168                "property": { "name": "Value" }
1169            },
1170            {
1171                "name": "flett temps",
1172                "interface": "xyz.openbmc_project.Sensor.Value",
1173                "property": { "name": "Value" }
1174            },
1175            {
1176                "name": "pcie cable card temps",
1177                "interface": "xyz.openbmc_project.Sensor.Value",
1178                "property": { "name": "Value" }
1179            }
1180        ],
1181        "triggers": [
1182            {
1183                "class": "timer",
1184                "type": "repeating",
1185                "interval": 2000000,
1186                "preload_groups": true
1187            }
1188        ],
1189        "actions": [
1190            {
1191                "name": "set_net_increase_target",
1192                "groups": [
1193                    {
1194                        "name": "proc0 core temps",
1195                        "interface": "xyz.openbmc_project.Sensor.Value",
1196                        "property": { "name": "Value" }
1197                    }
1198                ],
1199                "state_parameter_name": "proc_0_core_dvfs_increase_temp",
1200                "delta": 300
1201            },
1202            {
1203                "name": "set_net_increase_target",
1204                "groups": [
1205                    {
1206                        "name": "proc1 core temps",
1207                        "interface": "xyz.openbmc_project.Sensor.Value",
1208                        "property": { "name": "Value" }
1209                    }
1210                ],
1211                "state_parameter_name": "proc_1_core_dvfs_increase_temp",
1212                "delta": 300
1213            },
1214            {
1215                "name": "set_net_increase_target",
1216                "groups": [
1217                    {
1218                        "name": "proc2 core temps",
1219                        "interface": "xyz.openbmc_project.Sensor.Value",
1220                        "property": { "name": "Value" }
1221                    }
1222                ],
1223                "state_parameter_name": "proc_2_core_dvfs_increase_temp",
1224                "delta": 300
1225            },
1226            {
1227                "name": "set_net_increase_target",
1228                "groups": [
1229                    {
1230                        "name": "proc3 core temps",
1231                        "interface": "xyz.openbmc_project.Sensor.Value",
1232                        "property": { "name": "Value" }
1233                    }
1234                ],
1235                "state_parameter_name": "proc_3_core_dvfs_increase_temp",
1236                "delta": 300
1237            },
1238            {
1239                "name": "set_net_increase_target",
1240                "groups": [
1241                    {
1242                        "name": "proc0 ioring temp",
1243                        "interface": "xyz.openbmc_project.Sensor.Value",
1244                        "property": { "name": "Value" }
1245                    }
1246                ],
1247                "state_parameter_name": "proc_0_ioring_dvfs_increase_temp",
1248                "delta": 300
1249            },
1250            {
1251                "name": "set_net_increase_target",
1252                "groups": [
1253                    {
1254                        "name": "proc1 ioring temp",
1255                        "interface": "xyz.openbmc_project.Sensor.Value",
1256                        "property": { "name": "Value" }
1257                    }
1258                ],
1259                "state_parameter_name": "proc_1_ioring_dvfs_increase_temp",
1260                "delta": 300
1261            },
1262            {
1263                "name": "set_net_increase_target",
1264                "groups": [
1265                    {
1266                        "name": "proc2 ioring temp",
1267                        "interface": "xyz.openbmc_project.Sensor.Value",
1268                        "property": { "name": "Value" }
1269                    }
1270                ],
1271                "state_parameter_name": "proc_2_ioring_dvfs_increase_temp",
1272                "delta": 300
1273            },
1274            {
1275                "name": "set_net_increase_target",
1276                "groups": [
1277                    {
1278                        "name": "proc3 ioring temp",
1279                        "interface": "xyz.openbmc_project.Sensor.Value",
1280                        "property": { "name": "Value" }
1281                    }
1282                ],
1283                "state_parameter_name": "proc_3_ioring_dvfs_increase_temp",
1284                "delta": 300
1285            },
1286            {
1287                "name": "set_net_increase_target",
1288                "groups": [
1289                    {
1290                        "name": "dram temps",
1291                        "interface": "xyz.openbmc_project.Sensor.Value",
1292                        "property": { "name": "Value" }
1293                    }
1294                ],
1295                "state_parameter_name": "dram_dvfs_increase_temp",
1296                "delta": 100
1297            },
1298            {
1299                "name": "set_net_increase_target",
1300                "groups": [
1301                    {
1302                        "name": "pmic temps",
1303                        "interface": "xyz.openbmc_project.Sensor.Value",
1304                        "property": { "name": "Value" }
1305                    }
1306                ],
1307                "state_parameter_name": "pmic_dvfs_increase_temp",
1308                "delta": 100
1309            },
1310            {
1311                "name": "set_net_increase_target",
1312                "groups": [
1313                    {
1314                        "name": "internal memory buffer temps",
1315                        "interface": "xyz.openbmc_project.Sensor.Value",
1316                        "property": { "name": "Value" }
1317                    }
1318                ],
1319                "state_parameter_name": "intmb_dvfs_increase_temp",
1320                "delta": 100
1321            },
1322            {
1323                "name": "set_net_increase_target",
1324                "groups": [
1325                    {
1326                        "name": "dram and external memory buffer temps",
1327                        "interface": "xyz.openbmc_project.Sensor.Value",
1328                        "property": { "name": "Value" }
1329                    }
1330                ],
1331                "state_parameter_name": "dram_extmb_dvfs_increase_temp",
1332                "delta": 200
1333            },
1334            {
1335                "name": "set_net_increase_target",
1336                "groups": [
1337                    {
1338                        "name": "external memory buffer temps",
1339                        "interface": "xyz.openbmc_project.Sensor.Value",
1340                        "property": { "name": "Value" }
1341                    }
1342                ],
1343                "state_parameter_name": "extmb_dvfs_increase_temp",
1344                "delta": 200
1345            },
1346            {
1347                "name": "set_net_increase_target",
1348                "groups": [
1349                    {
1350                        "name": "vdd vrm temps",
1351                        "interface": "xyz.openbmc_project.Sensor.Value",
1352                        "property": { "name": "Value" }
1353                    }
1354                ],
1355                "state": 82.0,
1356                "delta": 300
1357            },
1358            {
1359                "name": "set_net_increase_target",
1360                "groups": [
1361                    {
1362                        "name": "nvme temps",
1363                        "interface": "xyz.openbmc_project.Sensor.Value",
1364                        "property": { "name": "Value" }
1365                    }
1366                ],
1367                "state": 58.0,
1368                "delta": 200
1369            },
1370            {
1371                "name": "set_net_increase_target",
1372                "groups": [
1373                    {
1374                        "name": "planar temps",
1375                        "interface": "xyz.openbmc_project.Sensor.Value",
1376                        "property": { "name": "Value" }
1377                    }
1378                ],
1379                "state": 65.0,
1380                "delta": 255
1381            },
1382            {
1383                "name": "set_net_increase_target",
1384                "groups": [
1385                    {
1386                        "name": "flett temps",
1387                        "interface": "xyz.openbmc_project.Sensor.Value",
1388                        "property": { "name": "Value" }
1389                    }
1390                ],
1391                "state": 80.0,
1392                "delta": 200
1393            },
1394            {
1395                "name": "set_net_increase_target",
1396                "groups": [
1397                    {
1398                        "name": "pcie cable card temps",
1399                        "interface": "xyz.openbmc_project.Sensor.Value",
1400                        "property": { "name": "Value" }
1401                    }
1402                ],
1403                "state": 70.0,
1404                "delta": 255
1405            },
1406            {
1407                "name": "set_net_decrease_target",
1408                "groups": [
1409                    {
1410                        "name": "proc0 core temps",
1411                        "interface": "xyz.openbmc_project.Sensor.Value",
1412                        "property": { "name": "Value" }
1413                    }
1414                ],
1415                "state_parameter_name": "proc_0_core_dvfs_decrease_temp",
1416                "delta": 50
1417            },
1418            {
1419                "name": "set_net_decrease_target",
1420                "groups": [
1421                    {
1422                        "name": "proc1 core temps",
1423                        "interface": "xyz.openbmc_project.Sensor.Value",
1424                        "property": { "name": "Value" }
1425                    }
1426                ],
1427                "state_parameter_name": "proc_1_core_dvfs_decrease_temp",
1428                "delta": 50
1429            },
1430            {
1431                "name": "set_net_decrease_target",
1432                "groups": [
1433                    {
1434                        "name": "proc2 core temps",
1435                        "interface": "xyz.openbmc_project.Sensor.Value",
1436                        "property": { "name": "Value" }
1437                    }
1438                ],
1439                "state_parameter_name": "proc_2_core_dvfs_decrease_temp",
1440                "delta": 50
1441            },
1442            {
1443                "name": "set_net_decrease_target",
1444                "groups": [
1445                    {
1446                        "name": "proc3 core temps",
1447                        "interface": "xyz.openbmc_project.Sensor.Value",
1448                        "property": { "name": "Value" }
1449                    }
1450                ],
1451                "state_parameter_name": "proc_3_core_dvfs_decrease_temp",
1452                "delta": 50
1453            },
1454            {
1455                "name": "set_net_decrease_target",
1456                "groups": [
1457                    {
1458                        "name": "proc0 ioring temp",
1459                        "interface": "xyz.openbmc_project.Sensor.Value",
1460                        "property": { "name": "Value" }
1461                    }
1462                ],
1463                "state_parameter_name": "proc_0_ioring_dvfs_decrease_temp",
1464                "delta": 50
1465            },
1466            {
1467                "name": "set_net_decrease_target",
1468                "groups": [
1469                    {
1470                        "name": "proc1 ioring temp",
1471                        "interface": "xyz.openbmc_project.Sensor.Value",
1472                        "property": { "name": "Value" }
1473                    }
1474                ],
1475                "state_parameter_name": "proc_1_ioring_dvfs_decrease_temp",
1476                "delta": 50
1477            },
1478            {
1479                "name": "set_net_decrease_target",
1480                "groups": [
1481                    {
1482                        "name": "proc2 ioring temp",
1483                        "interface": "xyz.openbmc_project.Sensor.Value",
1484                        "property": { "name": "Value" }
1485                    }
1486                ],
1487                "state_parameter_name": "proc_2_ioring_dvfs_decrease_temp",
1488                "delta": 50
1489            },
1490            {
1491                "name": "set_net_decrease_target",
1492                "groups": [
1493                    {
1494                        "name": "proc3 ioring temp",
1495                        "interface": "xyz.openbmc_project.Sensor.Value",
1496                        "property": { "name": "Value" }
1497                    }
1498                ],
1499                "state_parameter_name": "proc_3_ioring_dvfs_decrease_temp",
1500                "delta": 50
1501            },
1502            {
1503                "name": "set_net_decrease_target",
1504                "groups": [
1505                    {
1506                        "name": "dram temps",
1507                        "interface": "xyz.openbmc_project.Sensor.Value",
1508                        "property": { "name": "Value" }
1509                    }
1510                ],
1511                "state_parameter_name": "dram_dvfs_decrease_temp",
1512                "delta": 40
1513            },
1514            {
1515                "name": "set_net_decrease_target",
1516                "groups": [
1517                    {
1518                        "name": "pmic temps",
1519                        "interface": "xyz.openbmc_project.Sensor.Value",
1520                        "property": { "name": "Value" }
1521                    }
1522                ],
1523                "state_parameter_name": "pmic_dvfs_decrease_temp",
1524                "delta": 40
1525            },
1526            {
1527                "name": "set_net_decrease_target",
1528                "groups": [
1529                    {
1530                        "name": "internal memory buffer temps",
1531                        "interface": "xyz.openbmc_project.Sensor.Value",
1532                        "property": { "name": "Value" }
1533                    }
1534                ],
1535                "state_parameter_name": "intmb_dvfs_decrease_temp",
1536                "delta": 40
1537            },
1538            {
1539                "name": "set_net_decrease_target",
1540                "groups": [
1541                    {
1542                        "name": "dram and external memory buffer temps",
1543                        "interface": "xyz.openbmc_project.Sensor.Value",
1544                        "property": { "name": "Value" }
1545                    }
1546                ],
1547                "state_parameter_name": "dram_extmb_dvfs_decrease_temp",
1548                "delta": 40
1549            },
1550            {
1551                "name": "set_net_decrease_target",
1552                "groups": [
1553                    {
1554                        "name": "external memory buffer temps",
1555                        "interface": "xyz.openbmc_project.Sensor.Value",
1556                        "property": { "name": "Value" }
1557                    }
1558                ],
1559                "state_parameter_name": "extmb_dvfs_decrease_temp",
1560                "delta": 40
1561            },
1562            {
1563                "name": "set_net_decrease_target",
1564                "groups": [
1565                    {
1566                        "name": "vdd vrm temps",
1567                        "interface": "xyz.openbmc_project.Sensor.Value",
1568                        "property": { "name": "Value" }
1569                    }
1570                ],
1571                "state": 79.0,
1572                "delta": 30
1573            },
1574            {
1575                "name": "set_net_decrease_target",
1576                "groups": [
1577                    {
1578                        "name": "nvme temps",
1579                        "interface": "xyz.openbmc_project.Sensor.Value",
1580                        "property": { "name": "Value" }
1581                    }
1582                ],
1583                "state": 55.0,
1584                "delta": 40
1585            },
1586            {
1587                "name": "set_net_decrease_target",
1588                "groups": [
1589                    {
1590                        "name": "planar temps",
1591                        "interface": "xyz.openbmc_project.Sensor.Value",
1592                        "property": { "name": "Value" }
1593                    }
1594                ],
1595                "state": 60.0,
1596                "delta": 80
1597            },
1598            {
1599                "name": "set_net_decrease_target",
1600                "groups": [
1601                    {
1602                        "name": "flett temps",
1603                        "interface": "xyz.openbmc_project.Sensor.Value",
1604                        "property": { "name": "Value" }
1605                    }
1606                ],
1607                "state": 75.0,
1608                "delta": 80
1609            },
1610            {
1611                "name": "set_net_decrease_target",
1612                "groups": [
1613                    {
1614                        "name": "pcie cable card temps",
1615                        "interface": "xyz.openbmc_project.Sensor.Value",
1616                        "property": { "name": "Value" }
1617                    }
1618                ],
1619                "state": 65.0,
1620                "delta": 80
1621            }
1622        ]
1623    },
1624    {
1625        // Remove NVMe temperature objects from cache when they are removed from
1626        // dbus. There's no need to react to their removal.
1627        "name": "remove nvme objects",
1628        "groups": [
1629            {
1630                "name": "nvme temps",
1631                "interface": "xyz.openbmc_project.Sensor.Value",
1632                "property": { "name": "Value" }
1633            },
1634            {
1635                "name": "nvme temps",
1636                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
1637                "property": { "name": "Functional" }
1638            }
1639        ],
1640        "triggers": [
1641            {
1642                "class": "signal",
1643                "signal": "interfaces_removed"
1644            }
1645        ]
1646    },
1647    {
1648        "name": "set pcie floor index",
1649        "groups": [
1650            {
1651                "name": "pcie slots",
1652                "interface": "xyz.openbmc_project.State.Decorator.PowerState",
1653                "property": {
1654                    "name": "PowerState"
1655                }
1656            },
1657            {
1658                "name": "pcie cards",
1659                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
1660                "property": {
1661                    "name": "Function0DeviceId"
1662                }
1663            },
1664            {
1665                "name": "pcie cards",
1666                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
1667                "property": {
1668                    "name": "Function0VendorId"
1669                }
1670            },
1671            {
1672                "name": "pcie cards",
1673                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
1674                "property": {
1675                    "name": "Function0SubsystemId"
1676                }
1677            },
1678            {
1679                "name": "pcie cards",
1680                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
1681                "property": {
1682                    "name": "Function0SubsystemVendorId"
1683                }
1684            }
1685        ],
1686        "triggers": [
1687            {
1688                "class": "init",
1689                "method": "get_properties"
1690            },
1691            {
1692                "class": "signal",
1693                "signal": "properties_changed"
1694            },
1695            {
1696                "class": "signal",
1697                "signal": "interfaces_added"
1698            }
1699        ],
1700        "actions": [
1701            {
1702                "name": "pcie_card_floors",
1703                "use_config_specific_files": true,
1704                "settle_time": 2
1705            }
1706        ]
1707    },
1708    {
1709        "name": "Set altitude offset parameter",
1710        "groups": [
1711            {
1712                "name": "altitude",
1713                "interface": "xyz.openbmc_project.Sensor.Value",
1714                "property": { "name": "Value" }
1715            }
1716        ],
1717        "triggers": [
1718            {
1719                "class": "init",
1720                "method": "get_properties"
1721            },
1722            {
1723                "class": "signal",
1724                "signal": "interfaces_added"
1725            },
1726            {
1727                // Refresh altitude every 24hrs
1728                "class": "timer",
1729                "type": "repeating",
1730                "interval": 86400000000,
1731                "preload_groups": true
1732            }
1733        ],
1734        "actions": [
1735            {
1736                "name": "set_parameter_from_group_max",
1737                "parameter_name": "ambient_20_altitude_offset",
1738                "modifier": {
1739                    "operator": "less_than",
1740                    "default_value": 10000,
1741                    "value": [
1742                        { "arg_value": 500, "parameter_value": 0 },
1743                        { "arg_value": 1000, "parameter_value": 700 },
1744                        { "arg_value": 1500, "parameter_value": 1600 },
1745                        { "arg_value": 2000, "parameter_value": 2300 },
1746                        { "arg_value": 2500, "parameter_value": 3200 },
1747                        { "arg_value": 3300, "parameter_value": 4000 }
1748                    ]
1749                }
1750            },
1751            {
1752                "name": "set_parameter_from_group_max",
1753                "parameter_name": "ambient_25_altitude_offset",
1754                "modifier": {
1755                    "operator": "less_than",
1756                    "default_value": 10000,
1757                    "value": [
1758                        { "arg_value": 500, "parameter_value": 0 },
1759                        { "arg_value": 1000, "parameter_value": 1000 },
1760                        { "arg_value": 1500, "parameter_value": 2100 },
1761                        { "arg_value": 2000, "parameter_value": 3100 },
1762                        { "arg_value": 2500, "parameter_value": 4100 },
1763                        { "arg_value": 3300, "parameter_value": 4900 }
1764                    ]
1765                }
1766            },
1767            {
1768                "name": "set_parameter_from_group_max",
1769                "parameter_name": "ambient_30_altitude_offset",
1770                "modifier": {
1771                    "operator": "less_than",
1772                    "default_value": 10000,
1773                    "value": [
1774                        { "arg_value": 500, "parameter_value": 0 },
1775                        { "arg_value": 1000, "parameter_value": 1000 },
1776                        { "arg_value": 1500, "parameter_value": 2100 },
1777                        { "arg_value": 2000, "parameter_value": 3200 },
1778                        { "arg_value": 2500, "parameter_value": 4000 },
1779                        { "arg_value": 3300, "parameter_value": 4800 }
1780                    ]
1781                }
1782            },
1783            {
1784                "name": "set_parameter_from_group_max",
1785                "parameter_name": "ambient_35_altitude_offset",
1786                "modifier": {
1787                    "operator": "less_than",
1788                    "default_value": 10000,
1789                    "value": [
1790                        { "arg_value": 500, "parameter_value": 0 },
1791                        { "arg_value": 1000, "parameter_value": 900 },
1792                        { "arg_value": 1500, "parameter_value": 1700 },
1793                        { "arg_value": 2000, "parameter_value": 2500 },
1794                        { "arg_value": 2500, "parameter_value": 3400 },
1795                        { "arg_value": 3300, "parameter_value": 4200 }
1796                    ]
1797                }
1798            },
1799            {
1800                "name": "set_parameter_from_group_max",
1801                "parameter_name": "ambient_40_altitude_offset",
1802                "modifier": {
1803                    "operator": "less_than",
1804                    "default_value": 10000,
1805                    "value": [
1806                        { "arg_value": 500, "parameter_value": 0 },
1807                        { "arg_value": 1000, "parameter_value": 1000 },
1808                        { "arg_value": 1500, "parameter_value": 1900 },
1809                        { "arg_value": 2000, "parameter_value": 2800 },
1810                        { "arg_value": 2500, "parameter_value": 3700 },
1811                        { "arg_value": 3300, "parameter_value": 4500 }
1812                    ]
1813                }
1814            }
1815        ]
1816    },
1817    {
1818        "name": "Fan floors",
1819        "groups": [
1820            {
1821                "name": "ambient temp",
1822                "interface": "xyz.openbmc_project.Sensor.Value",
1823                "property": { "name": "Value" }
1824            }
1825        ],
1826        "triggers": [
1827            {
1828                "class": "init",
1829                "method": "get_properties"
1830            },
1831            {
1832                "class": "signal",
1833                "signal": "properties_changed"
1834            },
1835            {
1836                "class": "signal",
1837                "signal": "interfaces_added"
1838            },
1839            {
1840                "class": "parameter",
1841                "parameter": "pcie_floor_index"
1842            },
1843            {
1844                "class": "parameter",
1845                "parameter": "ambient_20_altitude_offset"
1846            },
1847            {
1848                "class": "parameter",
1849                "parameter": "ambient_25_altitude_offset"
1850            },
1851            {
1852                "class": "parameter",
1853                "parameter": "ambient_30_altitude_offset"
1854            },
1855            {
1856                "class": "parameter",
1857                "parameter": "ambient_35_altitude_offset"
1858            },
1859            {
1860                "class": "parameter",
1861                "parameter": "ambient_40_altitude_offset"
1862            }
1863        ],
1864        "actions": [
1865            {
1866                "name": "mapped_floor",
1867                "key_group": "ambient temp",
1868                "fan_floors": [
1869                    {
1870                        // Entry valid for temps < 20
1871                        "key": 20,
1872                        "default_floor": 5400,
1873                        "floor_offset_parameter": "ambient_20_altitude_offset",
1874                        "floors": [
1875                            {
1876                                "parameter": "pcie_floor_index",
1877                                "floors": [
1878                                    { "value": 1, "floor": 5600 },
1879                                    { "value": 2, "floor": 9000 },
1880                                    { "value": 3, "floor": 9000 },
1881                                    { "value": 4, "floor": 9200 },
1882                                    { "value": 5, "floor": 10600 }
1883                                ]
1884                            }
1885                        ]
1886                    },
1887                    {
1888                        // Entry valid for temps < 25
1889                        "key": 25,
1890                        "default_floor": 7300,
1891                        "floor_offset_parameter": "ambient_25_altitude_offset",
1892                        "floors": [
1893                            {
1894                                "parameter": "pcie_floor_index",
1895                                "floors": [
1896                                    { "value": 1, "floor": 7800 },
1897                                    { "value": 2, "floor": 10700 },
1898                                    { "value": 3, "floor": 11300 },
1899                                    { "value": 4, "floor": 12700 },
1900                                    { "value": 5, "floor": 13900 }
1901                                ]
1902                            }
1903                        ]
1904                    },
1905                    {
1906                        // Entry valid for temps < 30
1907                        "key": 30,
1908                        "default_floor": 9100,
1909                        "floor_offset_parameter": "ambient_30_altitude_offset",
1910                        "floors": [
1911                            {
1912                                "parameter": "pcie_floor_index",
1913                                "floors": [
1914                                    { "value": 1, "floor": 10300 },
1915                                    { "value": 2, "floor": 12100 },
1916                                    { "value": 3, "floor": 14400 },
1917                                    { "value": 4, "floor": 16300 },
1918                                    { "value": 5, "floor": 17200 }
1919                                ]
1920                            }
1921                        ]
1922                    },
1923                    {
1924                        // Entry valid for temps < 35
1925                        "key": 35,
1926                        "default_floor": 10800,
1927                        "floor_offset_parameter": "ambient_35_altitude_offset",
1928                        "floors": [
1929                            {
1930                                "parameter": "pcie_floor_index",
1931                                "floors": [
1932                                    { "value": 1, "floor": 12700 },
1933                                    { "value": 2, "floor": 13500 },
1934                                    { "value": 3, "floor": 17400 },
1935                                    { "value": 4, "floor": 18000 },
1936                                    { "value": 5, "floor": 18000 }
1937                                ]
1938                            }
1939                        ]
1940                    },
1941                    {
1942                        // Entry valid for temps < 40
1943                        "key": 40,
1944                        "default_floor": 12600,
1945                        "floor_offset_parameter": "ambient_40_altitude_offset",
1946                        "floors": [
1947                            {
1948                                "parameter": "pcie_floor_index",
1949                                "floors": [
1950                                    { "value": 1, "floor": 15000 },
1951                                    { "value": 2, "floor": 15500 },
1952                                    { "value": 3, "floor": 18000 },
1953                                    { "value": 4, "floor": 18000 },
1954                                    { "value": 5, "floor": 18000 }
1955                                ]
1956                            }
1957                        ]
1958                    }
1959                ]
1960            }
1961        ]
1962    }
1963]
1964