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                "floor": 18000
536            }
537        ]
538    },
539    {
540        "name": "Set Proc 0 Core DVFS parameter",
541        "groups": [
542            {
543                "name": "proc 0 core dvfs temp",
544                "interface": "xyz.openbmc_project.Sensor.Value",
545                "property": { "name": "Value" }
546            }
547        ],
548        "triggers": [
549            {
550                "class": "init",
551                "method": "get_properties"
552            },
553            {
554                "class": "signal",
555                "signal": "interfaces_added"
556            },
557            {
558                "class": "signal",
559                "signal": "properties_changed"
560            }
561        ],
562        "actions": [
563            {
564                "name": "set_parameter_from_group_max",
565                "parameter_name": "proc_0_core_dvfs_increase_temp",
566                "modifier": {
567                    "operator": "minus",
568                    "value": 10
569                }
570            },
571            {
572                "name": "set_parameter_from_group_max",
573                "parameter_name": "proc_0_core_dvfs_decrease_temp",
574                "modifier": {
575                    "operator": "minus",
576                    "value": 13
577                }
578            }
579        ]
580    },
581    {
582        "name": "Set Proc 1 Core DVFS parameter",
583        "groups": [
584            {
585                "name": "proc 1 core dvfs temp",
586                "interface": "xyz.openbmc_project.Sensor.Value",
587                "property": { "name": "Value" }
588            }
589        ],
590        "triggers": [
591            {
592                "class": "init",
593                "method": "get_properties"
594            },
595            {
596                "class": "signal",
597                "signal": "interfaces_added"
598            },
599            {
600                "class": "signal",
601                "signal": "properties_changed"
602            }
603        ],
604        "actions": [
605            {
606                "name": "set_parameter_from_group_max",
607                "parameter_name": "proc_1_core_dvfs_increase_temp",
608                "modifier": {
609                    "operator": "minus",
610                    "value": 10
611                }
612            },
613            {
614                "name": "set_parameter_from_group_max",
615                "parameter_name": "proc_1_core_dvfs_decrease_temp",
616                "modifier": {
617                    "operator": "minus",
618                    "value": 13
619                }
620            }
621        ]
622    },
623    {
624        "name": "Set Proc 2 Core DVFS parameter",
625        "groups": [
626            {
627                "name": "proc 2 core dvfs temp",
628                "interface": "xyz.openbmc_project.Sensor.Value",
629                "property": { "name": "Value" }
630            }
631        ],
632        "triggers": [
633            {
634                "class": "init",
635                "method": "get_properties"
636            },
637            {
638                "class": "signal",
639                "signal": "interfaces_added"
640            },
641            {
642                "class": "signal",
643                "signal": "properties_changed"
644            }
645        ],
646        "actions": [
647            {
648                "name": "set_parameter_from_group_max",
649                "parameter_name": "proc_2_core_dvfs_increase_temp",
650                "modifier": {
651                    "operator": "minus",
652                    "value": 10
653                }
654            },
655            {
656                "name": "set_parameter_from_group_max",
657                "parameter_name": "proc_2_core_dvfs_decrease_temp",
658                "modifier": {
659                    "operator": "minus",
660                    "value": 13
661                }
662            }
663        ]
664    },
665    {
666        "name": "Set Proc 3 Core DVFS parameter",
667        "groups": [
668            {
669                "name": "proc 3 core dvfs temp",
670                "interface": "xyz.openbmc_project.Sensor.Value",
671                "property": { "name": "Value" }
672            }
673        ],
674        "triggers": [
675            {
676                "class": "init",
677                "method": "get_properties"
678            },
679            {
680                "class": "signal",
681                "signal": "interfaces_added"
682            },
683            {
684                "class": "signal",
685                "signal": "properties_changed"
686            }
687        ],
688        "actions": [
689            {
690                "name": "set_parameter_from_group_max",
691                "parameter_name": "proc_3_core_dvfs_increase_temp",
692                "modifier": {
693                    "operator": "minus",
694                    "value": 10
695                }
696            },
697            {
698                "name": "set_parameter_from_group_max",
699                "parameter_name": "proc_3_core_dvfs_decrease_temp",
700                "modifier": {
701                    "operator": "minus",
702                    "value": 13
703                }
704            }
705        ]
706    },
707    {
708        "name": "Set Proc 0 IO Ring DVFS parameter",
709        "groups": [
710            {
711                "name": "proc 0 ioring dvfs temp",
712                "interface": "xyz.openbmc_project.Sensor.Value",
713                "property": { "name": "Value" }
714            }
715        ],
716        "triggers": [
717            {
718                "class": "init",
719                "method": "get_properties"
720            },
721            {
722                "class": "signal",
723                "signal": "interfaces_added"
724            },
725            {
726                "class": "signal",
727                "signal": "properties_changed"
728            }
729        ],
730        "actions": [
731            {
732                "name": "set_parameter_from_group_max",
733                "parameter_name": "proc_0_ioring_dvfs_increase_temp",
734                "modifier": {
735                    "operator": "minus",
736                    "value": 10
737                }
738            },
739            {
740                "name": "set_parameter_from_group_max",
741                "parameter_name": "proc_0_ioring_dvfs_decrease_temp",
742                "modifier": {
743                    "operator": "minus",
744                    "value": 13
745                }
746            }
747        ]
748    },
749    {
750        "name": "Set Proc 1 IO Ring DVFS parameter",
751        "groups": [
752            {
753                "name": "proc 1 ioring dvfs temp",
754                "interface": "xyz.openbmc_project.Sensor.Value",
755                "property": { "name": "Value" }
756            }
757        ],
758        "triggers": [
759            {
760                "class": "init",
761                "method": "get_properties"
762            },
763            {
764                "class": "signal",
765                "signal": "interfaces_added"
766            },
767            {
768                "class": "signal",
769                "signal": "properties_changed"
770            }
771        ],
772        "actions": [
773            {
774                "name": "set_parameter_from_group_max",
775                "parameter_name": "proc_1_ioring_dvfs_increase_temp",
776                "modifier": {
777                    "operator": "minus",
778                    "value": 10
779                }
780            },
781            {
782                "name": "set_parameter_from_group_max",
783                "parameter_name": "proc_1_ioring_dvfs_decrease_temp",
784                "modifier": {
785                    "operator": "minus",
786                    "value": 13
787                }
788            }
789        ]
790    },
791    {
792        "name": "Set Proc 2 IO Ring DVFS parameter",
793        "groups": [
794            {
795                "name": "proc 2 ioring dvfs temp",
796                "interface": "xyz.openbmc_project.Sensor.Value",
797                "property": { "name": "Value" }
798            }
799        ],
800        "triggers": [
801            {
802                "class": "init",
803                "method": "get_properties"
804            },
805            {
806                "class": "signal",
807                "signal": "interfaces_added"
808            },
809            {
810                "class": "signal",
811                "signal": "properties_changed"
812            }
813        ],
814        "actions": [
815            {
816                "name": "set_parameter_from_group_max",
817                "parameter_name": "proc_2_ioring_dvfs_increase_temp",
818                "modifier": {
819                    "operator": "minus",
820                    "value": 10
821                }
822            },
823            {
824                "name": "set_parameter_from_group_max",
825                "parameter_name": "proc_2_ioring_dvfs_decrease_temp",
826                "modifier": {
827                    "operator": "minus",
828                    "value": 13
829                }
830            }
831        ]
832    },
833    {
834        "name": "Set Proc 3 IO Ring DVFS parameter",
835        "groups": [
836            {
837                "name": "proc 3 ioring dvfs temp",
838                "interface": "xyz.openbmc_project.Sensor.Value",
839                "property": { "name": "Value" }
840            }
841        ],
842        "triggers": [
843            {
844                "class": "init",
845                "method": "get_properties"
846            },
847            {
848                "class": "signal",
849                "signal": "properties_changed"
850            },
851            {
852                "class": "signal",
853                "signal": "interfaces_added"
854            }
855        ],
856        "actions": [
857            {
858                "name": "set_parameter_from_group_max",
859                "parameter_name": "proc_3_ioring_dvfs_increase_temp",
860                "modifier": {
861                    "operator": "minus",
862                    "value": 10
863                }
864            },
865            {
866                "name": "set_parameter_from_group_max",
867                "parameter_name": "proc_3_ioring_dvfs_decrease_temp",
868                "modifier": {
869                    "operator": "minus",
870                    "value": 13
871                }
872            }
873        ]
874    },
875    {
876        "name": "Set DRAM DVFS parameter",
877        "groups": [
878            {
879                "name": "dram dvfs temp",
880                "interface": "xyz.openbmc_project.Sensor.Value",
881                "property": { "name": "Value" }
882            }
883        ],
884        "triggers": [
885            {
886                "class": "init",
887                "method": "get_properties"
888            },
889            {
890                "class": "signal",
891                "signal": "properties_changed"
892            },
893            {
894                "class": "signal",
895                "signal": "interfaces_added"
896            }
897        ],
898        "actions": [
899            {
900                "name": "set_parameter_from_group_max",
901                "parameter_name": "dram_dvfs_increase_temp",
902                "modifier": {
903                    "operator": "minus",
904                    "value": 9
905                }
906            },
907            {
908                "name": "set_parameter_from_group_max",
909                "parameter_name": "dram_dvfs_decrease_temp",
910                "modifier": {
911                    "operator": "minus",
912                    "value": 12
913                }
914            }
915        ]
916    },
917    {
918        "name": "Set PMIC DVFS parameter",
919        "groups": [
920            {
921                "name": "pmic dvfs temp",
922                "interface": "xyz.openbmc_project.Sensor.Value",
923                "property": { "name": "Value" }
924            }
925        ],
926        "triggers": [
927            {
928                "class": "init",
929                "method": "get_properties"
930            },
931            {
932                "class": "signal",
933                "signal": "properties_changed"
934            },
935            {
936                "class": "signal",
937                "signal": "interfaces_added"
938            }
939        ],
940        "actions": [
941            {
942                "name": "set_parameter_from_group_max",
943                "parameter_name": "pmic_dvfs_increase_temp",
944                "modifier": {
945                    "operator": "minus",
946                    "value": 9
947                }
948            },
949            {
950                "name": "set_parameter_from_group_max",
951                "parameter_name": "pmic_dvfs_decrease_temp",
952                "modifier": {
953                    "operator": "minus",
954                    "value": 12
955                }
956            }
957        ]
958    },
959    {
960        "name": "Set internal memory buffer DVFS parameter",
961        "groups": [
962            {
963                "name": "internal memory buffer dvfs temp",
964                "interface": "xyz.openbmc_project.Sensor.Value",
965                "property": { "name": "Value" }
966            }
967        ],
968        "triggers": [
969            {
970                "class": "init",
971                "method": "get_properties"
972            },
973            {
974                "class": "signal",
975                "signal": "properties_changed"
976            },
977            {
978                "class": "signal",
979                "signal": "interfaces_added"
980            }
981        ],
982        "actions": [
983            {
984                "name": "set_parameter_from_group_max",
985                "parameter_name": "intmb_dvfs_increase_temp",
986                "modifier": {
987                    "operator": "minus",
988                    "value": 10
989                }
990            },
991            {
992                "name": "set_parameter_from_group_max",
993                "parameter_name": "intmb_dvfs_decrease_temp",
994                "modifier": {
995                    "operator": "minus",
996                    "value": 13
997                }
998            }
999        ]
1000    },
1001    {
1002        "name": "Set DRAM and external memory buffer DVFS parameter",
1003        "groups": [
1004            {
1005                "name": "dram and external memory buffer dvfs temp",
1006                "interface": "xyz.openbmc_project.Sensor.Value",
1007                "property": { "name": "Value" }
1008            }
1009        ],
1010        "triggers": [
1011            {
1012                "class": "init",
1013                "method": "get_properties"
1014            },
1015            {
1016                "class": "signal",
1017                "signal": "properties_changed"
1018            },
1019            {
1020                "class": "signal",
1021                "signal": "interfaces_added"
1022            }
1023        ],
1024        "actions": [
1025            {
1026                "name": "set_parameter_from_group_max",
1027                "parameter_name": "dram_extmb_dvfs_increase_temp",
1028                "modifier": {
1029                    "operator": "minus",
1030                    "value": 10
1031                }
1032            },
1033            {
1034                "name": "set_parameter_from_group_max",
1035                "parameter_name": "dram_extmb_dvfs_decrease_temp",
1036                "modifier": {
1037                    "operator": "minus",
1038                    "value": 13
1039                }
1040            }
1041        ]
1042    },
1043    {
1044        "name": "Set external memory buffer DVFS parameter",
1045        "groups": [
1046            {
1047                "name": "external memory buffer dvfs temp",
1048                "interface": "xyz.openbmc_project.Sensor.Value",
1049                "property": { "name": "Value" }
1050            }
1051        ],
1052        "triggers": [
1053            {
1054                "class": "init",
1055                "method": "get_properties"
1056            },
1057            {
1058                "class": "signal",
1059                "signal": "properties_changed"
1060            },
1061            {
1062                "class": "signal",
1063                "signal": "interfaces_added"
1064            }
1065        ],
1066        "actions": [
1067            {
1068                "name": "set_parameter_from_group_max",
1069                "parameter_name": "extmb_dvfs_increase_temp",
1070                "modifier": {
1071                    "operator": "minus",
1072                    "value": 10
1073                }
1074            },
1075            {
1076                "name": "set_parameter_from_group_max",
1077                "parameter_name": "extmb_dvfs_decrease_temp",
1078                "modifier": {
1079                    "operator": "minus",
1080                    "value": 13
1081                }
1082            }
1083        ]
1084    },
1085    {
1086        // Collect group temperatures each iteration the repeating timer expires
1087        "name": "Fan control timer loop",
1088        "groups": [
1089            {
1090                "name": "proc0 core temps",
1091                "interface": "xyz.openbmc_project.Sensor.Value",
1092                "property": { "name": "Value" }
1093            },
1094            {
1095                "name": "proc1 core temps",
1096                "interface": "xyz.openbmc_project.Sensor.Value",
1097                "property": { "name": "Value" }
1098            },
1099            {
1100                "name": "proc2 core temps",
1101                "interface": "xyz.openbmc_project.Sensor.Value",
1102                "property": { "name": "Value" }
1103            },
1104            {
1105                "name": "proc3 core temps",
1106                "interface": "xyz.openbmc_project.Sensor.Value",
1107                "property": { "name": "Value" }
1108            },
1109            {
1110                "name": "proc0 ioring temp",
1111                "interface": "xyz.openbmc_project.Sensor.Value",
1112                "property": { "name": "Value" }
1113            },
1114            {
1115                "name": "proc1 ioring temp",
1116                "interface": "xyz.openbmc_project.Sensor.Value",
1117                "property": { "name": "Value" }
1118            },
1119            {
1120                "name": "proc2 ioring temp",
1121                "interface": "xyz.openbmc_project.Sensor.Value",
1122                "property": { "name": "Value" }
1123            },
1124            {
1125                "name": "proc3 ioring temp",
1126                "interface": "xyz.openbmc_project.Sensor.Value",
1127                "property": { "name": "Value" }
1128            },
1129            {
1130                "name": "dram temps",
1131                "interface": "xyz.openbmc_project.Sensor.Value",
1132                "property": { "name": "Value" }
1133            },
1134            {
1135                "name": "pmic temps",
1136                "interface": "xyz.openbmc_project.Sensor.Value",
1137                "property": { "name": "Value" }
1138            },
1139            {
1140                "name": "internal memory buffer temps",
1141                "interface": "xyz.openbmc_project.Sensor.Value",
1142                "property": { "name": "Value" }
1143            },
1144            {
1145                "name": "dram and external memory buffer temps",
1146                "interface": "xyz.openbmc_project.Sensor.Value",
1147                "property": { "name": "Value" }
1148            },
1149            {
1150                "name": "external memory buffer temps",
1151                "interface": "xyz.openbmc_project.Sensor.Value",
1152                "property": { "name": "Value" }
1153            },
1154            {
1155                "name": "vdd vrm temps",
1156                "interface": "xyz.openbmc_project.Sensor.Value",
1157                "property": { "name": "Value" }
1158            },
1159            {
1160                "name": "nvme temps",
1161                "interface": "xyz.openbmc_project.Sensor.Value",
1162                "property": { "name": "Value" }
1163            },
1164            {
1165                "name": "planar temps",
1166                "interface": "xyz.openbmc_project.Sensor.Value",
1167                "property": { "name": "Value" }
1168            },
1169            {
1170                "name": "flett temps",
1171                "interface": "xyz.openbmc_project.Sensor.Value",
1172                "property": { "name": "Value" }
1173            },
1174            {
1175                "name": "pcie cable card temps",
1176                "interface": "xyz.openbmc_project.Sensor.Value",
1177                "property": { "name": "Value" }
1178            }
1179        ],
1180        "triggers": [
1181            {
1182                "class": "timer",
1183                "type": "repeating",
1184                "interval": 2000000,
1185                "preload_groups": true
1186            }
1187        ],
1188        "actions": [
1189            {
1190                "name": "set_net_increase_target",
1191                "groups": [
1192                    {
1193                        "name": "proc0 core temps",
1194                        "interface": "xyz.openbmc_project.Sensor.Value",
1195                        "property": { "name": "Value" }
1196                    }
1197                ],
1198                "state_parameter_name": "proc_0_core_dvfs_increase_temp",
1199                "delta": 300
1200            },
1201            {
1202                "name": "set_net_increase_target",
1203                "groups": [
1204                    {
1205                        "name": "proc1 core temps",
1206                        "interface": "xyz.openbmc_project.Sensor.Value",
1207                        "property": { "name": "Value" }
1208                    }
1209                ],
1210                "state_parameter_name": "proc_1_core_dvfs_increase_temp",
1211                "delta": 300
1212            },
1213            {
1214                "name": "set_net_increase_target",
1215                "groups": [
1216                    {
1217                        "name": "proc2 core temps",
1218                        "interface": "xyz.openbmc_project.Sensor.Value",
1219                        "property": { "name": "Value" }
1220                    }
1221                ],
1222                "state_parameter_name": "proc_2_core_dvfs_increase_temp",
1223                "delta": 300
1224            },
1225            {
1226                "name": "set_net_increase_target",
1227                "groups": [
1228                    {
1229                        "name": "proc3 core temps",
1230                        "interface": "xyz.openbmc_project.Sensor.Value",
1231                        "property": { "name": "Value" }
1232                    }
1233                ],
1234                "state_parameter_name": "proc_3_core_dvfs_increase_temp",
1235                "delta": 300
1236            },
1237            {
1238                "name": "set_net_increase_target",
1239                "groups": [
1240                    {
1241                        "name": "proc0 ioring temp",
1242                        "interface": "xyz.openbmc_project.Sensor.Value",
1243                        "property": { "name": "Value" }
1244                    }
1245                ],
1246                "state_parameter_name": "proc_0_ioring_dvfs_increase_temp",
1247                "delta": 300
1248            },
1249            {
1250                "name": "set_net_increase_target",
1251                "groups": [
1252                    {
1253                        "name": "proc1 ioring temp",
1254                        "interface": "xyz.openbmc_project.Sensor.Value",
1255                        "property": { "name": "Value" }
1256                    }
1257                ],
1258                "state_parameter_name": "proc_1_ioring_dvfs_increase_temp",
1259                "delta": 300
1260            },
1261            {
1262                "name": "set_net_increase_target",
1263                "groups": [
1264                    {
1265                        "name": "proc2 ioring temp",
1266                        "interface": "xyz.openbmc_project.Sensor.Value",
1267                        "property": { "name": "Value" }
1268                    }
1269                ],
1270                "state_parameter_name": "proc_2_ioring_dvfs_increase_temp",
1271                "delta": 300
1272            },
1273            {
1274                "name": "set_net_increase_target",
1275                "groups": [
1276                    {
1277                        "name": "proc3 ioring temp",
1278                        "interface": "xyz.openbmc_project.Sensor.Value",
1279                        "property": { "name": "Value" }
1280                    }
1281                ],
1282                "state_parameter_name": "proc_3_ioring_dvfs_increase_temp",
1283                "delta": 300
1284            },
1285            {
1286                "name": "set_net_increase_target",
1287                "groups": [
1288                    {
1289                        "name": "dram temps",
1290                        "interface": "xyz.openbmc_project.Sensor.Value",
1291                        "property": { "name": "Value" }
1292                    }
1293                ],
1294                "state_parameter_name": "dram_dvfs_increase_temp",
1295                "delta": 100
1296            },
1297            {
1298                "name": "set_net_increase_target",
1299                "groups": [
1300                    {
1301                        "name": "pmic temps",
1302                        "interface": "xyz.openbmc_project.Sensor.Value",
1303                        "property": { "name": "Value" }
1304                    }
1305                ],
1306                "state_parameter_name": "pmic_dvfs_increase_temp",
1307                "delta": 100
1308            },
1309            {
1310                "name": "set_net_increase_target",
1311                "groups": [
1312                    {
1313                        "name": "internal memory buffer temps",
1314                        "interface": "xyz.openbmc_project.Sensor.Value",
1315                        "property": { "name": "Value" }
1316                    }
1317                ],
1318                "state_parameter_name": "intmb_dvfs_increase_temp",
1319                "delta": 100
1320            },
1321            {
1322                "name": "set_net_increase_target",
1323                "groups": [
1324                    {
1325                        "name": "dram and external memory buffer temps",
1326                        "interface": "xyz.openbmc_project.Sensor.Value",
1327                        "property": { "name": "Value" }
1328                    }
1329                ],
1330                "state_parameter_name": "dram_extmb_dvfs_increase_temp",
1331                "delta": 200
1332            },
1333            {
1334                "name": "set_net_increase_target",
1335                "groups": [
1336                    {
1337                        "name": "external memory buffer temps",
1338                        "interface": "xyz.openbmc_project.Sensor.Value",
1339                        "property": { "name": "Value" }
1340                    }
1341                ],
1342                "state_parameter_name": "extmb_dvfs_increase_temp",
1343                "delta": 200
1344            },
1345            {
1346                "name": "set_net_increase_target",
1347                "groups": [
1348                    {
1349                        "name": "vdd vrm temps",
1350                        "interface": "xyz.openbmc_project.Sensor.Value",
1351                        "property": { "name": "Value" }
1352                    }
1353                ],
1354                "state": 82.0,
1355                "delta": 300
1356            },
1357            {
1358                "name": "set_net_increase_target",
1359                "groups": [
1360                    {
1361                        "name": "nvme temps",
1362                        "interface": "xyz.openbmc_project.Sensor.Value",
1363                        "property": { "name": "Value" }
1364                    }
1365                ],
1366                "state": 58.0,
1367                "delta": 200
1368            },
1369            {
1370                "name": "set_net_increase_target",
1371                "groups": [
1372                    {
1373                        "name": "planar temps",
1374                        "interface": "xyz.openbmc_project.Sensor.Value",
1375                        "property": { "name": "Value" }
1376                    }
1377                ],
1378                "state": 65.0,
1379                "delta": 255
1380            },
1381            {
1382                "name": "set_net_increase_target",
1383                "groups": [
1384                    {
1385                        "name": "flett temps",
1386                        "interface": "xyz.openbmc_project.Sensor.Value",
1387                        "property": { "name": "Value" }
1388                    }
1389                ],
1390                "state": 80.0,
1391                "delta": 200
1392            },
1393            {
1394                "name": "set_net_increase_target",
1395                "groups": [
1396                    {
1397                        "name": "pcie cable card temps",
1398                        "interface": "xyz.openbmc_project.Sensor.Value",
1399                        "property": { "name": "Value" }
1400                    }
1401                ],
1402                "state": 70.0,
1403                "delta": 255
1404            },
1405            {
1406                "name": "set_net_decrease_target",
1407                "groups": [
1408                    {
1409                        "name": "proc0 core temps",
1410                        "interface": "xyz.openbmc_project.Sensor.Value",
1411                        "property": { "name": "Value" }
1412                    }
1413                ],
1414                "state_parameter_name": "proc_0_core_dvfs_decrease_temp",
1415                "delta": 50
1416            },
1417            {
1418                "name": "set_net_decrease_target",
1419                "groups": [
1420                    {
1421                        "name": "proc1 core temps",
1422                        "interface": "xyz.openbmc_project.Sensor.Value",
1423                        "property": { "name": "Value" }
1424                    }
1425                ],
1426                "state_parameter_name": "proc_1_core_dvfs_decrease_temp",
1427                "delta": 50
1428            },
1429            {
1430                "name": "set_net_decrease_target",
1431                "groups": [
1432                    {
1433                        "name": "proc2 core temps",
1434                        "interface": "xyz.openbmc_project.Sensor.Value",
1435                        "property": { "name": "Value" }
1436                    }
1437                ],
1438                "state_parameter_name": "proc_2_core_dvfs_decrease_temp",
1439                "delta": 50
1440            },
1441            {
1442                "name": "set_net_decrease_target",
1443                "groups": [
1444                    {
1445                        "name": "proc3 core temps",
1446                        "interface": "xyz.openbmc_project.Sensor.Value",
1447                        "property": { "name": "Value" }
1448                    }
1449                ],
1450                "state_parameter_name": "proc_3_core_dvfs_decrease_temp",
1451                "delta": 50
1452            },
1453            {
1454                "name": "set_net_decrease_target",
1455                "groups": [
1456                    {
1457                        "name": "proc0 ioring temp",
1458                        "interface": "xyz.openbmc_project.Sensor.Value",
1459                        "property": { "name": "Value" }
1460                    }
1461                ],
1462                "state_parameter_name": "proc_0_ioring_dvfs_decrease_temp",
1463                "delta": 50
1464            },
1465            {
1466                "name": "set_net_decrease_target",
1467                "groups": [
1468                    {
1469                        "name": "proc1 ioring temp",
1470                        "interface": "xyz.openbmc_project.Sensor.Value",
1471                        "property": { "name": "Value" }
1472                    }
1473                ],
1474                "state_parameter_name": "proc_1_ioring_dvfs_decrease_temp",
1475                "delta": 50
1476            },
1477            {
1478                "name": "set_net_decrease_target",
1479                "groups": [
1480                    {
1481                        "name": "proc2 ioring temp",
1482                        "interface": "xyz.openbmc_project.Sensor.Value",
1483                        "property": { "name": "Value" }
1484                    }
1485                ],
1486                "state_parameter_name": "proc_2_ioring_dvfs_decrease_temp",
1487                "delta": 50
1488            },
1489            {
1490                "name": "set_net_decrease_target",
1491                "groups": [
1492                    {
1493                        "name": "proc3 ioring temp",
1494                        "interface": "xyz.openbmc_project.Sensor.Value",
1495                        "property": { "name": "Value" }
1496                    }
1497                ],
1498                "state_parameter_name": "proc_3_ioring_dvfs_decrease_temp",
1499                "delta": 50
1500            },
1501            {
1502                "name": "set_net_decrease_target",
1503                "groups": [
1504                    {
1505                        "name": "dram temps",
1506                        "interface": "xyz.openbmc_project.Sensor.Value",
1507                        "property": { "name": "Value" }
1508                    }
1509                ],
1510                "state_parameter_name": "dram_dvfs_decrease_temp",
1511                "delta": 40
1512            },
1513            {
1514                "name": "set_net_decrease_target",
1515                "groups": [
1516                    {
1517                        "name": "pmic temps",
1518                        "interface": "xyz.openbmc_project.Sensor.Value",
1519                        "property": { "name": "Value" }
1520                    }
1521                ],
1522                "state_parameter_name": "pmic_dvfs_decrease_temp",
1523                "delta": 40
1524            },
1525            {
1526                "name": "set_net_decrease_target",
1527                "groups": [
1528                    {
1529                        "name": "internal memory buffer temps",
1530                        "interface": "xyz.openbmc_project.Sensor.Value",
1531                        "property": { "name": "Value" }
1532                    }
1533                ],
1534                "state_parameter_name": "intmb_dvfs_decrease_temp",
1535                "delta": 40
1536            },
1537            {
1538                "name": "set_net_decrease_target",
1539                "groups": [
1540                    {
1541                        "name": "dram and external memory buffer temps",
1542                        "interface": "xyz.openbmc_project.Sensor.Value",
1543                        "property": { "name": "Value" }
1544                    }
1545                ],
1546                "state_parameter_name": "dram_extmb_dvfs_decrease_temp",
1547                "delta": 40
1548            },
1549            {
1550                "name": "set_net_decrease_target",
1551                "groups": [
1552                    {
1553                        "name": "external memory buffer temps",
1554                        "interface": "xyz.openbmc_project.Sensor.Value",
1555                        "property": { "name": "Value" }
1556                    }
1557                ],
1558                "state_parameter_name": "extmb_dvfs_decrease_temp",
1559                "delta": 40
1560            },
1561            {
1562                "name": "set_net_decrease_target",
1563                "groups": [
1564                    {
1565                        "name": "vdd vrm temps",
1566                        "interface": "xyz.openbmc_project.Sensor.Value",
1567                        "property": { "name": "Value" }
1568                    }
1569                ],
1570                "state": 79.0,
1571                "delta": 30
1572            },
1573            {
1574                "name": "set_net_decrease_target",
1575                "groups": [
1576                    {
1577                        "name": "nvme temps",
1578                        "interface": "xyz.openbmc_project.Sensor.Value",
1579                        "property": { "name": "Value" }
1580                    }
1581                ],
1582                "state": 55.0,
1583                "delta": 40
1584            },
1585            {
1586                "name": "set_net_decrease_target",
1587                "groups": [
1588                    {
1589                        "name": "planar temps",
1590                        "interface": "xyz.openbmc_project.Sensor.Value",
1591                        "property": { "name": "Value" }
1592                    }
1593                ],
1594                "state": 60.0,
1595                "delta": 80
1596            },
1597            {
1598                "name": "set_net_decrease_target",
1599                "groups": [
1600                    {
1601                        "name": "flett temps",
1602                        "interface": "xyz.openbmc_project.Sensor.Value",
1603                        "property": { "name": "Value" }
1604                    }
1605                ],
1606                "state": 75.0,
1607                "delta": 80
1608            },
1609            {
1610                "name": "set_net_decrease_target",
1611                "groups": [
1612                    {
1613                        "name": "pcie cable card temps",
1614                        "interface": "xyz.openbmc_project.Sensor.Value",
1615                        "property": { "name": "Value" }
1616                    }
1617                ],
1618                "state": 65.0,
1619                "delta": 80
1620            }
1621        ]
1622    },
1623    {
1624        // Remove NVMe temperature objects from cache when they are removed from
1625        // dbus. There's no need to react to their removal.
1626        "name": "remove nvme objects",
1627        "groups": [
1628            {
1629                "name": "nvme temps",
1630                "interface": "xyz.openbmc_project.Sensor.Value",
1631                "property": { "name": "Value" }
1632            },
1633            {
1634                "name": "nvme temps",
1635                "interface": "xyz.openbmc_project.State.Decorator.OperationalStatus",
1636                "property": { "name": "Functional" }
1637            }
1638        ],
1639        "triggers": [
1640            {
1641                "class": "signal",
1642                "signal": "interfaces_removed"
1643            }
1644        ]
1645    },
1646    {
1647        "name": "set pcie floor index",
1648        "groups": [
1649            {
1650                "name": "pcie slots",
1651                "interface": "xyz.openbmc_project.State.Decorator.PowerState",
1652                "property": {
1653                    "name": "PowerState"
1654                }
1655            },
1656            {
1657                "name": "pcie cards",
1658                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
1659                "property": {
1660                    "name": "Function0DeviceId"
1661                }
1662            },
1663            {
1664                "name": "pcie cards",
1665                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
1666                "property": {
1667                    "name": "Function0VendorId"
1668                }
1669            },
1670            {
1671                "name": "pcie cards",
1672                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
1673                "property": {
1674                    "name": "Function0SubsystemId"
1675                }
1676            },
1677            {
1678                "name": "pcie cards",
1679                "interface": "xyz.openbmc_project.Inventory.Item.PCIeDevice",
1680                "property": {
1681                    "name": "Function0SubsystemVendorId"
1682                }
1683            }
1684        ],
1685        "triggers": [
1686            {
1687                "class": "init",
1688                "method": "get_properties"
1689            },
1690            {
1691                "class": "signal",
1692                "signal": "properties_changed"
1693            },
1694            {
1695                "class": "signal",
1696                "signal": "interfaces_added"
1697            }
1698        ],
1699        "actions": [
1700            {
1701                "name": "pcie_card_floors",
1702                "use_config_specific_files": true,
1703                "settle_time": 2
1704            }
1705        ]
1706    },
1707    {
1708        "name": "Set altitude offset parameter",
1709        "groups": [
1710            {
1711                "name": "altitude",
1712                "interface": "xyz.openbmc_project.Sensor.Value",
1713                "property": { "name": "Value" }
1714            }
1715        ],
1716        "triggers": [
1717            {
1718                "class": "init",
1719                "method": "get_properties"
1720            },
1721            {
1722                "class": "signal",
1723                "signal": "interfaces_added"
1724            },
1725            {
1726                // Refresh altitude every 24hrs
1727                "class": "timer",
1728                "type": "repeating",
1729                "interval": 86400000000,
1730                "preload_groups": true
1731            }
1732        ],
1733        "actions": [
1734            {
1735                "name": "set_parameter_from_group_max",
1736                "parameter_name": "ambient_20_altitude_offset",
1737                "modifier": {
1738                    "operator": "less_than",
1739                    "default_value": 10000,
1740                    "value": [
1741                        { "arg_value": 500, "parameter_value": 0 },
1742                        { "arg_value": 1000, "parameter_value": 700 },
1743                        { "arg_value": 1500, "parameter_value": 1600 },
1744                        { "arg_value": 2000, "parameter_value": 2300 },
1745                        { "arg_value": 2500, "parameter_value": 3200 },
1746                        { "arg_value": 3300, "parameter_value": 4000 }
1747                    ]
1748                }
1749            },
1750            {
1751                "name": "set_parameter_from_group_max",
1752                "parameter_name": "ambient_25_altitude_offset",
1753                "modifier": {
1754                    "operator": "less_than",
1755                    "default_value": 10000,
1756                    "value": [
1757                        { "arg_value": 500, "parameter_value": 0 },
1758                        { "arg_value": 1000, "parameter_value": 1000 },
1759                        { "arg_value": 1500, "parameter_value": 2100 },
1760                        { "arg_value": 2000, "parameter_value": 3100 },
1761                        { "arg_value": 2500, "parameter_value": 4100 },
1762                        { "arg_value": 3300, "parameter_value": 4900 }
1763                    ]
1764                }
1765            },
1766            {
1767                "name": "set_parameter_from_group_max",
1768                "parameter_name": "ambient_30_altitude_offset",
1769                "modifier": {
1770                    "operator": "less_than",
1771                    "default_value": 10000,
1772                    "value": [
1773                        { "arg_value": 500, "parameter_value": 0 },
1774                        { "arg_value": 1000, "parameter_value": 1000 },
1775                        { "arg_value": 1500, "parameter_value": 2100 },
1776                        { "arg_value": 2000, "parameter_value": 3200 },
1777                        { "arg_value": 2500, "parameter_value": 4000 },
1778                        { "arg_value": 3300, "parameter_value": 4800 }
1779                    ]
1780                }
1781            },
1782            {
1783                "name": "set_parameter_from_group_max",
1784                "parameter_name": "ambient_35_altitude_offset",
1785                "modifier": {
1786                    "operator": "less_than",
1787                    "default_value": 10000,
1788                    "value": [
1789                        { "arg_value": 500, "parameter_value": 0 },
1790                        { "arg_value": 1000, "parameter_value": 900 },
1791                        { "arg_value": 1500, "parameter_value": 1700 },
1792                        { "arg_value": 2000, "parameter_value": 2500 },
1793                        { "arg_value": 2500, "parameter_value": 3400 },
1794                        { "arg_value": 3300, "parameter_value": 4200 }
1795                    ]
1796                }
1797            },
1798            {
1799                "name": "set_parameter_from_group_max",
1800                "parameter_name": "ambient_40_altitude_offset",
1801                "modifier": {
1802                    "operator": "less_than",
1803                    "default_value": 10000,
1804                    "value": [
1805                        { "arg_value": 500, "parameter_value": 0 },
1806                        { "arg_value": 1000, "parameter_value": 1000 },
1807                        { "arg_value": 1500, "parameter_value": 1900 },
1808                        { "arg_value": 2000, "parameter_value": 2800 },
1809                        { "arg_value": 2500, "parameter_value": 3700 },
1810                        { "arg_value": 3300, "parameter_value": 4500 }
1811                    ]
1812                }
1813            }
1814        ]
1815    },
1816    {
1817        "name": "Fan floors",
1818        "groups": [
1819            {
1820                "name": "ambient temp",
1821                "interface": "xyz.openbmc_project.Sensor.Value",
1822                "property": { "name": "Value" }
1823            }
1824        ],
1825        "triggers": [
1826            {
1827                "class": "init",
1828                "method": "get_properties"
1829            },
1830            {
1831                "class": "signal",
1832                "signal": "properties_changed"
1833            },
1834            {
1835                "class": "signal",
1836                "signal": "interfaces_added"
1837            },
1838            {
1839                "class": "parameter",
1840                "parameter": "pcie_floor_index"
1841            },
1842            {
1843                "class": "parameter",
1844                "parameter": "ambient_20_altitude_offset"
1845            },
1846            {
1847                "class": "parameter",
1848                "parameter": "ambient_25_altitude_offset"
1849            },
1850            {
1851                "class": "parameter",
1852                "parameter": "ambient_30_altitude_offset"
1853            },
1854            {
1855                "class": "parameter",
1856                "parameter": "ambient_35_altitude_offset"
1857            },
1858            {
1859                "class": "parameter",
1860                "parameter": "ambient_40_altitude_offset"
1861            }
1862        ],
1863        "actions": [
1864            {
1865                "name": "mapped_floor",
1866                "key_group": "ambient temp",
1867                "fan_floors": [
1868                    {
1869                        // Entry valid for temps < 20
1870                        "key": 20,
1871                        "default_floor": 5400,
1872                        "floor_offset_parameter": "ambient_20_altitude_offset",
1873                        "floors": [
1874                            {
1875                                "parameter": "pcie_floor_index",
1876                                "floors": [
1877                                    { "value": 1, "floor": 5600 },
1878                                    { "value": 2, "floor": 9000 },
1879                                    { "value": 3, "floor": 9000 },
1880                                    { "value": 4, "floor": 9200 },
1881                                    { "value": 5, "floor": 10600 }
1882                                ]
1883                            }
1884                        ]
1885                    },
1886                    {
1887                        // Entry valid for temps < 25
1888                        "key": 25,
1889                        "default_floor": 7300,
1890                        "floor_offset_parameter": "ambient_25_altitude_offset",
1891                        "floors": [
1892                            {
1893                                "parameter": "pcie_floor_index",
1894                                "floors": [
1895                                    { "value": 1, "floor": 7800 },
1896                                    { "value": 2, "floor": 10700 },
1897                                    { "value": 3, "floor": 11300 },
1898                                    { "value": 4, "floor": 12700 },
1899                                    { "value": 5, "floor": 13900 }
1900                                ]
1901                            }
1902                        ]
1903                    },
1904                    {
1905                        // Entry valid for temps < 30
1906                        "key": 30,
1907                        "default_floor": 9100,
1908                        "floor_offset_parameter": "ambient_30_altitude_offset",
1909                        "floors": [
1910                            {
1911                                "parameter": "pcie_floor_index",
1912                                "floors": [
1913                                    { "value": 1, "floor": 10300 },
1914                                    { "value": 2, "floor": 12100 },
1915                                    { "value": 3, "floor": 14400 },
1916                                    { "value": 4, "floor": 16300 },
1917                                    { "value": 5, "floor": 17200 }
1918                                ]
1919                            }
1920                        ]
1921                    },
1922                    {
1923                        // Entry valid for temps < 35
1924                        "key": 35,
1925                        "default_floor": 10800,
1926                        "floor_offset_parameter": "ambient_35_altitude_offset",
1927                        "floors": [
1928                            {
1929                                "parameter": "pcie_floor_index",
1930                                "floors": [
1931                                    { "value": 1, "floor": 12700 },
1932                                    { "value": 2, "floor": 13500 },
1933                                    { "value": 3, "floor": 17400 },
1934                                    { "value": 4, "floor": 18000 },
1935                                    { "value": 5, "floor": 18000 }
1936                                ]
1937                            }
1938                        ]
1939                    },
1940                    {
1941                        // Entry valid for temps < 40
1942                        "key": 40,
1943                        "default_floor": 12600,
1944                        "floor_offset_parameter": "ambient_40_altitude_offset",
1945                        "floors": [
1946                            {
1947                                "parameter": "pcie_floor_index",
1948                                "floors": [
1949                                    { "value": 1, "floor": 15000 },
1950                                    { "value": 2, "floor": 15500 },
1951                                    { "value": 3, "floor": 18000 },
1952                                    { "value": 4, "floor": 18000 },
1953                                    { "value": 5, "floor": 18000 }
1954                                ]
1955                            }
1956                        ]
1957                    }
1958                ]
1959            }
1960        ]
1961    }
1962]
1963