groups:
    - name: air_cooled_zone0_fans
      description: Group of fan inventory objects for air cooled zone 0
      type: /xyz/openbmc_project/inventory
      members:
          - /system/chassis/motherboard/fan0
          - /system/chassis/motherboard/fan1
          - /system/chassis/motherboard/fan2
    - name: zone0_ambient
      description: Group of ambient temperature sensors for zone 0
      type: /xyz/openbmc_project/sensors
      members:
          - /temperature/outlet
    - name: occ0_object
      description: Dbus object containing OCC0 properties
      type: /org/open_power/control
      members:
          - /occ0
    - name: occ1_object
      description: Dbus object containing OCC1 properties
      type: /org/open_power/control
      members:
          - /occ1
    - name: zone0_cores
      description: Group of core temperature sensors for zone 0
      type: /xyz/openbmc_project/sensors
      members:
          - /temperature/p0_core0_temp
          - /temperature/p0_core1_temp
          - /temperature/p0_core2_temp
          - /temperature/p0_core3_temp
          - /temperature/p0_core4_temp
          - /temperature/p0_core5_temp
          - /temperature/p0_core6_temp
          - /temperature/p0_core7_temp
          - /temperature/p0_core8_temp
          - /temperature/p0_core9_temp
          - /temperature/p0_core10_temp
          - /temperature/p0_core11_temp
          - /temperature/p0_core12_temp
          - /temperature/p0_core13_temp
          - /temperature/p0_core14_temp
          - /temperature/p0_core15_temp
          - /temperature/p0_core16_temp
          - /temperature/p0_core17_temp
          - /temperature/p0_core18_temp
          - /temperature/p0_core19_temp
          - /temperature/p0_core20_temp
          - /temperature/p0_core21_temp
          - /temperature/p0_core22_temp
          - /temperature/p0_core23_temp
          - /temperature/p1_core0_temp
          - /temperature/p1_core1_temp
          - /temperature/p1_core2_temp
          - /temperature/p1_core3_temp
          - /temperature/p1_core4_temp
          - /temperature/p1_core5_temp
          - /temperature/p1_core6_temp
          - /temperature/p1_core7_temp
          - /temperature/p1_core8_temp
          - /temperature/p1_core9_temp
          - /temperature/p1_core10_temp
          - /temperature/p1_core11_temp
          - /temperature/p1_core12_temp
          - /temperature/p1_core13_temp
          - /temperature/p1_core14_temp
          - /temperature/p1_core15_temp
          - /temperature/p1_core16_temp
          - /temperature/p1_core17_temp
          - /temperature/p1_core18_temp
          - /temperature/p1_core19_temp
          - /temperature/p1_core20_temp
          - /temperature/p1_core21_temp
          - /temperature/p1_core22_temp
          - /temperature/p1_core23_temp
    - name: zone0_dimms
      description: Group of dimm temperature sensors for zone 0
      type: /xyz/openbmc_project/sensors
      members:
          - /temperature/dimm0_temp
          - /temperature/dimm1_temp
          - /temperature/dimm2_temp
          - /temperature/dimm3_temp
          - /temperature/dimm4_temp
          - /temperature/dimm5_temp
          - /temperature/dimm6_temp
          - /temperature/dimm7_temp
          - /temperature/dimm8_temp
          - /temperature/dimm9_temp
          - /temperature/dimm10_temp
          - /temperature/dimm11_temp
          - /temperature/dimm12_temp
          - /temperature/dimm13_temp
          - /temperature/dimm14_temp
          - /temperature/dimm15_temp

matches:
    - name: propertiesChanged
      parameters:
          - object
          - interface
    - name: interfacesAdded
      parameters:
          - object
    - name: nameOwnerChanged
      parameters:
          - object
          - interface

signals:
    - name: propertiesChanged
      description: >
          A property changed match
      parameters:
          - type
          - object
          - interface
          - property
      match: propertiesChanged
    - name: interfacesAdded
      description: >
          An interfaces added match
      parameters:
          - type
          - object
          - interface
          - property
      match: interfacesAdded
    - name: nameOwnerChanged
      description: >
          A name owner changed match
      parameters:
      match: nameOwnerChanged

methods:
    - name: getProperties
      description: >
          Get the property values of the given group members
          by performing a `GetProperty` method call on each
      parameters:
          - type
    - name: nameHasOwner
      description: >
          A NameHasOwner method call to be performed on all event group members
      parameters:

handlers:
    - name: setProperty
      description: >
          Sets a value for the given object/interface/property
      parameters:
          - type
    - name: setService
      description: >
          Sets the service name and ownership status for the given group
      parameters:
          - group

preconditions:
    - name: property_states_match
      description: >
          All defined properties must match the values given to
          enable a set speed event otherwise fan speeds are set to full
      parameters:
          - groups
    - name: services_missing_owner
      description: >
          Any services missing an owner enable the events given otherwise
          the events are removed/disabled
      parameters:

actions:
    - name: call_actions_based_on_timer
      description: >
          Sets up a list of actions to be invoked when the defined timer
          expires (or for each expiration of a repeating timer)
      parameters:
          - timer
          - actions
    - name: default_floor_on_missing_owner
      description: >
          Set the fan floor to the default floor
    - name: set_speed_on_missing_owner
      description: >
          Set fans to the given speed when any service within the group
          no longer exists
      parameters:
          - speed
    - name: set_request_speed_base_with_max
      description: >
          Set the base request speed of a zone to the max value of a group for
          calculating a new target speed
    - name: count_state_before_speed
      description: Set the speed when a number of properties at a state
      parameters:
          - count
          - property
          - speed
    - name: set_floor_from_average_sensor_value
      description: Set floor speed from first entry with average less than key
      parameters:
          - map
    - name: set_ceiling_from_average_sensor_value
      description: Set ceiling speed based on key transition values with average
      parameters:
          - map
    - name: set_net_increase_speed
      description: >
          Set the speed increase delta based on a factor applied to
          the delta increase size times the given value and property's
          value difference
      parameters:
          - property
          - factor
          - delta
    - name: set_net_decrease_speed
      description: >
          Set the speed decrease delta based on a factor applied to
          the delta decrease size times the given value and property's
          value difference
      parameters:
          - property
          - factor
          - delta

events:
    - name: default_fan_floor_on_service_fail
      precondition:
          name: services_missing_owner
          groups:
              - name: zone0_ambient
                interface: xyz.openbmc_project.Sensor.Value
                property:
                    name: Value
                    type: int64_t
          triggers:
              - name: init
                method: nameHasOwner
                handler: setService
              - name: signal
                signal: nameOwnerChanged
                handler: setService
          events:
              - name: default_fan_floor
                groups:
                    - name: zone0_ambient
                      interface: xyz.openbmc_project.Sensor.Value
                      property:
                          name: Value
                          type: int64_t
                triggers:
                    - name: timer
                      interval: 5000000
                      type: oneshot
                actions:
                    - name: default_floor_on_missing_owner
    - name: high_speed_on_occ_service_fail
      groups:
          - name: occ0_object
            interface: org.open_power.OCC.Status
            property:
                name: OccActive
                type: bool
          - name: occ1_object
            interface: org.open_power.OCC.Status
            property:
                name: OccActive
                type: bool
      triggers:
          - name: init
            method: nameHasOwner
            handler: setService
          - name: signal
            signal: nameOwnerChanged
            handler: setService
      actions:
          - name: call_actions_based_on_timer
            timer:
                interval: 5000000
                type: oneshot
            actions:
                - name: set_speed_on_missing_owner
                  speed:
                      value: 255
                      type: uint64_t
    - name: missing_or_fails_before_high_speed_air
      groups:
          - name: air_cooled_zone0_fans
            interface: xyz.openbmc_project.Inventory.Item
            property:
                name: Present
                type: bool
          - name: air_cooled_zone0_fans
            interface: xyz.openbmc_project.State.Decorator.OperationalStatus
            property:
                name: Functional
                type: bool
      triggers:
          - name: init
            method: getProperties
            handler: setProperty
          - name: signal
            signal: propertiesChanged
            handler: setProperty
      actions:
          - name: count_state_before_speed
            count: 1
            property:
                value: false
                type: bool
            speed:
                value: 255
                type: uint64_t
    - name: set_air_cooled_speed_boundaries_based_on_ambient
      groups:
          - name: zone0_ambient
            interface: xyz.openbmc_project.Sensor.Value
            property:
                name: Value
                type: int64_t
      triggers:
          - name: init
            method: getProperties
            handler: setProperty
          - name: signal
            signal: propertiesChanged
            handler: setProperty
      actions:
          - name: set_floor_from_average_sensor_value
            map:
                value:
                    - 27000: 85
                    - 32000: 112
                    - 37000: 126
                    - 40000: 141
                type: std::map<int64_t, uint64_t>
          - name: set_ceiling_from_average_sensor_value
            map:
                value:
                    - 25000: 175
                    - 27000: 255
                type: std::map<int64_t, uint64_t>
    - name: occ_active_speed_changes
      precondition:
          name: property_states_match
          groups:
              - name: occ0_object
                interface: org.open_power.OCC.Status
                property:
                    name: OccActive
                    type: bool
                    value: true
              - name: occ1_object
                interface: org.open_power.OCC.Status
                property:
                    name: OccActive
                    type: bool
                    value: true
          triggers:
              - name: init
                method: getProperties
                handler: setProperty
              - name: signal
                signal: interfacesAdded
                handler: setProperty
              - name: signal
                signal: propertiesChanged
                handler: setProperty
          events:
              - name: speed_control_sensors
                groups:
                    - name: zone0_cores
                      interface: xyz.openbmc_project.Sensor.Value
                      property:
                          name: Value
                          type: int64_t
                    - name: zone0_dimms
                      interface: xyz.openbmc_project.Sensor.Value
                      property:
                          name: Value
                          type: int64_t
                triggers:
                    - name: init
                      method: getProperties
                      handler: setProperty
                    - name: signal
                      signal: interfacesAdded
                      handler: setProperty
                    - name: signal
                      signal: propertiesChanged
                      handler: setProperty
              - name: 1sec_speed_change_request_sampling
                triggers:
                    - name: timer
                      interval: 1000000
                      type: repeating
                actions:
                    # Speed changes based on core temps
                    - name: set_net_increase_speed
                      groups:
                          - name: zone0_cores
                            interface: xyz.openbmc_project.Sensor.Value
                            property:
                                name: Value
                                type: int64_t
                      property:
                          value: 73000
                          type: int64_t
                      factor:
                          value: 1000
                          type: int64_t
                      delta:
                          value: 11
                          type: uint64_t
                    - name: set_net_decrease_speed
                      groups:
                          - name: zone0_cores
                            interface: xyz.openbmc_project.Sensor.Value
                            property:
                                name: Value
                                type: int64_t
                      property:
                          value: 70000
                          type: int64_t
                      factor:
                          value: 1000
                          type: int64_t
                      delta:
                          value: 11
                          type: uint64_t
                    # Speed changes based on dimm temps
                    - name: set_net_increase_speed
                      groups:
                          - name: zone0_dimms
                            interface: xyz.openbmc_project.Sensor.Value
                            property:
                                name: Value
                                type: int64_t
                      property:
                          value: 64000
                          type: int64_t
                      factor:
                          value: 1000
                          type: int64_t
                      delta:
                          value: 6
                          type: uint64_t
                    - name: set_net_decrease_speed
                      groups:
                          - name: zone0_dimms
                            interface: xyz.openbmc_project.Sensor.Value
                            property:
                                name: Value
                                type: int64_t
                      property:
                          value: 61000
                          type: int64_t
                      factor:
                          value: 1000
                          type: int64_t
                      delta:
                          value: 6
                          type: uint64_t
