meta-facebook: yosemite4: Set the fan LED to amber or blue

Set the fan led to amber when the fan tach triggers critical threshold.

Test Plan:
Modify the threshold and check if the led is correct.

Change-Id: I1ad360c15b2e4ff9c47d6e0bbc81e3a30ab1cd23
Signed-off-by: Delphine CC Chiu <Delphine_CC_Chiu@wiwynn.com>
diff --git a/meta-facebook/meta-yosemite4/conf/machine/yosemite4.conf b/meta-facebook/meta-yosemite4/conf/machine/yosemite4.conf
index 635c278..802a164 100644
--- a/meta-facebook/meta-yosemite4/conf/machine/yosemite4.conf
+++ b/meta-facebook/meta-yosemite4/conf/machine/yosemite4.conf
@@ -26,3 +26,5 @@
 
 VIRTUAL-RUNTIME_obmc-host-state-manager = "phosphor-state-manager-host"
 VIRTUAL-RUNTIME_obmc-chassis-state-manager = "phosphor-state-manager-chassis"
+
+PREFERRED_PROVIDER_virtual/phosphor-led-manager-config-native = "yosemite4-led-manager-config-native"
\ No newline at end of file
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led.bb b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led.bb
new file mode 100644
index 0000000..0758813
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led.bb
@@ -0,0 +1,55 @@
+SUMMARY = "Fan fault led configurations for meta-yosemite4 machines"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit allarch
+inherit phosphor-dbus-monitor
+
+FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:"
+
+SRC_URI:append = " \
+    file://board-0-fan-0.yaml \
+    file://board-0-fan-1.yaml \
+    file://board-0-fan-4.yaml \
+    file://board-0-fan-5.yaml \
+    file://board-0-fan-8.yaml \
+    file://board-0-fan-9.yaml \
+    file://board-1-fan-10.yaml \
+    file://board-1-fan-11.yaml \
+    file://board-1-fan-2.yaml \
+    file://board-1-fan-3.yaml \
+    file://board-1-fan-6.yaml \
+    file://board-1-fan-7.yaml \
+"
+
+do_install() {
+    install -D ${WORKDIR}/board-0-fan-0.yaml ${D}${config_dir}/board-0-fan-0.yaml
+    install -D ${WORKDIR}/board-0-fan-1.yaml ${D}${config_dir}/board-0-fan-1.yaml
+    install -D ${WORKDIR}/board-0-fan-4.yaml ${D}${config_dir}/board-0-fan-4.yaml
+    install -D ${WORKDIR}/board-0-fan-5.yaml ${D}${config_dir}/board-0-fan-5.yaml
+    install -D ${WORKDIR}/board-0-fan-8.yaml ${D}${config_dir}/board-0-fan-8.yaml
+    install -D ${WORKDIR}/board-0-fan-9.yaml ${D}${config_dir}/board-0-fan-9.yaml
+    install -D ${WORKDIR}/board-1-fan-10.yaml ${D}${config_dir}/board-1-fan-10.yaml
+    install -D ${WORKDIR}/board-1-fan-11.yaml ${D}${config_dir}/board-1-fan-11.yaml
+    install -D ${WORKDIR}/board-1-fan-2.yaml ${D}${config_dir}/board-1-fan-2.yaml
+    install -D ${WORKDIR}/board-1-fan-3.yaml ${D}${config_dir}/board-1-fan-3.yaml
+    install -D ${WORKDIR}/board-1-fan-6.yaml ${D}${config_dir}/board-1-fan-6.yaml
+    install -D ${WORKDIR}/board-1-fan-7.yaml ${D}${config_dir}/board-1-fan-7.yaml
+}
+
+FILES:${PN}:append = " \
+    ${config_dir}/board-0-fan-0.yaml \
+    ${config_dir}/board-0-fan-1.yaml \
+    ${config_dir}/board-0-fan-4.yaml \
+    ${config_dir}/board-0-fan-5.yaml \
+    ${config_dir}/board-0-fan-8.yaml \
+    ${config_dir}/board-0-fan-9.yaml \
+    ${config_dir}/board-1-fan-10.yaml \
+    ${config_dir}/board-1-fan-11.yaml \
+    ${config_dir}/board-1-fan-2.yaml \
+    ${config_dir}/board-1-fan-3.yaml \
+    ${config_dir}/board-1-fan-6.yaml \
+    ${config_dir}/board-1-fan-7.yaml \
+"
+
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-0.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-0.yaml
new file mode 100644
index 0000000..f961fbe
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-0.yaml
@@ -0,0 +1,122 @@
+- name: board 0 fan 0 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN0_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN0_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 0 fan 0 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 0 fan 0 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 0 fan 0 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 0 fan 0 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 0 fan 0 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 0 fan 0 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan0_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan0_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan0_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan0_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-1.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-1.yaml
new file mode 100644
index 0000000..7e2fbf6
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-1.yaml
@@ -0,0 +1,122 @@
+- name: board 0 fan 1 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN1_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN1_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 0 fan 1 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 0 fan 1 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 0 fan 1 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 0 fan 1 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 0 fan 1 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 0 fan 1 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan1_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan1_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan1_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan1_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-4.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-4.yaml
new file mode 100644
index 0000000..f6f2264
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-4.yaml
@@ -0,0 +1,122 @@
+- name: board 0 fan 4 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN4_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN4_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 0 fan 4 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 0 fan 4 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 0 fan 4 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 0 fan 4 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 0 fan 4 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 0 fan 4 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan4_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan4_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan4_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan4_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-5.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-5.yaml
new file mode 100644
index 0000000..db21ec8
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-5.yaml
@@ -0,0 +1,122 @@
+- name: board 0 fan 5 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN5_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN5_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 0 fan 5 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 0 fan 5 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 0 fan 5 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 0 fan 5 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 0 fan 5 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 0 fan 5 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan5_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan5_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan5_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan5_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-8.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-8.yaml
new file mode 100644
index 0000000..92df2de
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-8.yaml
@@ -0,0 +1,122 @@
+- name: board 0 fan 8 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN8_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN8_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 0 fan 8 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 0 fan 8 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 0 fan 8 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 0 fan 8 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 0 fan 8 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 0 fan 8 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan8_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan8_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan8_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan8_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-9.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-9.yaml
new file mode 100644
index 0000000..cdf6e69
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-0-fan-9.yaml
@@ -0,0 +1,122 @@
+- name: board 0 fan 9 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN9_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD0_FAN9_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 0 fan 9 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 0 fan 9 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 0 fan 9 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 0 fan 9 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 0 fan 9 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 0 fan 9 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan9_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan9_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan9_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan9_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-10.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-10.yaml
new file mode 100644
index 0000000..4658559
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-10.yaml
@@ -0,0 +1,122 @@
+- name: board 1 fan 10 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN10_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN10_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 1 fan 10 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 1 fan 10 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 1 fan 10 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 1 fan 10 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 1 fan 10 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 1 fan 10 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan10_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan10_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan10_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan10_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-11.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-11.yaml
new file mode 100644
index 0000000..1503292
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-11.yaml
@@ -0,0 +1,122 @@
+- name: board 1 fan 11 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN11_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN11_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 1 fan 11 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 1 fan 11 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 1 fan 11 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 1 fan 11 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 1 fan 11 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 1 fan 11 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan11_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan11_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan11_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan11_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-2.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-2.yaml
new file mode 100644
index 0000000..639583c
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-2.yaml
@@ -0,0 +1,122 @@
+- name: board 1 fan 2 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN2_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN2_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 1 fan 2 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 1 fan 2 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 1 fan 2 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 1 fan 2 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 1 fan 2 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 1 fan 2 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan2_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan2_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan2_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan2_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-3.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-3.yaml
new file mode 100644
index 0000000..15263b8
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-3.yaml
@@ -0,0 +1,122 @@
+- name: board 1 fan 3 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN3_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN3_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 1 fan 3 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 1 fan 3 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 1 fan 3 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 1 fan 3 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 1 fan 3 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 1 fan 3 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan3_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan3_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan3_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan3_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-6.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-6.yaml
new file mode 100644
index 0000000..7e849a8
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-6.yaml
@@ -0,0 +1,122 @@
+- name: board 1 fan 6 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN6_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN6_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 1 fan 6 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 1 fan 6 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 1 fan 6 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 1 fan 6 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 1 fan 6 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 1 fan 6 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan6_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan6_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan6_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan6_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-7.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-7.yaml
new file mode 100644
index 0000000..01ea532
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/fan-fault-led/board-1-fan-7.yaml
@@ -0,0 +1,122 @@
+- name: board 1 fan 7 current critical alarm path group
+  class: group
+  group: path
+  members:
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN7_TACH_IL
+      - meta: PATH
+        path: /xyz/openbmc_project/sensors/fan_tach/FANBOARD1_FAN7_TACH_OL
+
+- name: current fan critical alarm property
+  class: group
+  group: property
+  type: boolean
+  members:
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmHigh
+      - interface: xyz.openbmc_project.Sensor.Threshold.Critical
+        meta: PROPERTY
+        property: CriticalAlarmLow
+
+- name: board 1 fan 7 critical alarm assert
+  class: watch
+  watch: property
+  paths: board 1 fan 7 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold assert
+
+- name: board 1 fan 7 critical alarm deassert
+  class: watch
+  watch: property
+  paths: board 1 fan 7 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: check if fan critical threshold deassert
+
+- name: check if fan critical threshold assert
+  class: condition
+  condition: count
+  paths: board 1 fan 7 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan fail
+  countop: ">="
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: check if fan critical threshold deassert
+  class: condition
+  condition: count
+  paths: board 1 fan 7 current critical alarm path group
+  properties: current fan critical alarm property
+  callback: set fan ok
+  countop: "<"
+  countbound: 1
+  op: "=="
+  bound: true
+
+- name: set fan ok group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan7_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan7_ok.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group assert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-start@fan7_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan fail group deassert
+  class: callback
+  callback: method
+  service: org.freedesktop.systemd1
+  path: /org/freedesktop/systemd1
+  interface: org.freedesktop.systemd1.Manager
+  method: StartUnit
+  args:
+      - value: obmc-led-group-stop@fan7_fail.service
+        type: string
+      - value: replace
+        type: string
+
+- name: set fan ok
+  class: callback
+  callback: group
+  members:
+      - set fan ok group assert
+      - set fan fail group deassert
+
+- name: set fan fail
+  class: callback
+  callback: group
+  members:
+      - set fan fail group assert
+      - set fan ok group deassert
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend
index 34c8160..4b93a9f 100644
--- a/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend
@@ -1 +1,2 @@
-PHOSPHOR_DBUS_MONITOR_CONFIGS:append = " "
+PHOSPHOR_DBUS_MONITOR_CONFIGS:append = " power-saving-policy"
+PHOSPHOR_DBUS_MONITOR_CONFIGS:append = " fan-fault-led"
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/images/fb-yosemite4-phosphor-image.inc b/meta-facebook/meta-yosemite4/recipes-phosphor/images/fb-yosemite4-phosphor-image.inc
index 81f687e..2b5727e 100644
--- a/meta-facebook/meta-yosemite4/recipes-phosphor/images/fb-yosemite4-phosphor-image.inc
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/images/fb-yosemite4-phosphor-image.inc
@@ -3,9 +3,6 @@
 # If multi-user.target doesn't complete,
 # the obmc-host-startmin@.target couldn't start.
 # In that case, BMC couldn't set current host state to "Running".
-IMAGE_FEATURES:remove = " \
-    obmc-leds \
-"
 
 # Temporarily add libusb1 to allow side-loading of a BIOS/BIC update
 # application which need libusb1.  Should be removed when BIOS and BIC update
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/leds/phosphor-led-manager_%.bbappend b/meta-facebook/meta-yosemite4/recipes-phosphor/leds/phosphor-led-manager_%.bbappend
new file mode 100644
index 0000000..c12b056
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/leds/phosphor-led-manager_%.bbappend
@@ -0,0 +1,18 @@
+SYSTEMD_SERVICE:${PN}-faultmonitor:remove:yosemite4 = "obmc-fru-fault-monitor.service"
+SYSTEMD_LINK:${PN}:remove:yosemite4 = "../obmc-led-group-start@.service:multi-user.target.wants/obmc-led-group-start@bmc_booted.service"
+SYSTEMD_LINK:${PN}:remove:yosemite4 = "${@compose_list_zip(d, 'FMT', 'CHASSIS_TARGETS', 'STATES')}"
+SYSTEMD_LINK:${PN}:remove:yosemite4 = "${@compose_list(d, 'CHASSIS_LED_BLACKOUT_FMT', 'OBMC_CHASSIS_INSTANCES' )}"
+SYSTEMD_OVERRIDE:${PN}:remove:yosemite4 = "bmc_booted.conf:obmc-led-group-start@bmc_booted.service.d/bmc_booted.conf"
+
+FAN_INSTANCES="0 1 2 3 4 5 6 7 8 9 10 11"
+FAN_OK_START_INSTFMT="obmc-led-group-start@.service:obmc-led-group-start@fan{0}_ok.service"
+SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'FAN_OK_START_INSTFMT', 'FAN_INSTANCES')}"
+
+FAN_FAIL_START_INSTFMT="obmc-led-group-start@.service:obmc-led-group-start@fan{0}_fail.service"
+SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'FAN_FAIL_START_INSTFMT', 'FAN_INSTANCES')}"
+
+FAN_OK_STOP_INSTFMT="obmc-led-group-stop@.service:obmc-led-group-stop@fan{0}_ok.service"
+SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'FAN_OK_STOP_INSTFMT', 'FAN_INSTANCES')}"
+
+FAN_FAIL_STOP_INSTFMT="obmc-led-group-stop@.service:obmc-led-group-stop@fan{0}_fail.service"
+SYSTEMD_LINK:${PN} += "${@compose_list_zip(d, 'FAN_FAIL_STOP_INSTFMT', 'FAN_INSTANCES')}"
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/leds/yosemite4-led-manager-config-native.bb b/meta-facebook/meta-yosemite4/recipes-phosphor/leds/yosemite4-led-manager-config-native.bb
new file mode 100644
index 0000000..895d7ee
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/leds/yosemite4-led-manager-config-native.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Phosphor LED Group Management for Yosemite4"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit native
+
+PROVIDES += "virtual/phosphor-led-manager-config-native"
+
+SRC_URI += "file://led.yaml"
+S = "${WORKDIR}"
+
+do_install() {
+    SRC=${S}
+    DEST=${D}${datadir}/phosphor-led-manager
+    install -D ${SRC}/led.yaml ${DEST}/led.yaml
+}
diff --git a/meta-facebook/meta-yosemite4/recipes-phosphor/leds/yosemite4-led-manager-config/led.yaml b/meta-facebook/meta-yosemite4/recipes-phosphor/leds/yosemite4-led-manager-config/led.yaml
new file mode 100644
index 0000000..7f89492
--- /dev/null
+++ b/meta-facebook/meta-yosemite4/recipes-phosphor/leds/yosemite4-led-manager-config/led.yaml
@@ -0,0 +1,143 @@
+fan0_ok:
+    fan0_blue:
+        Action: "On"
+    fan0_amber:
+        Action: "Off"
+
+fan0_fail:
+    fan0_blue:
+        Action: "Off"
+    fan0_amber:
+        Action: "On"
+
+fan1_ok:
+    fan1_blue:
+        Action: "On"
+    fan1_amber:
+        Action: "Off"
+
+fan1_fail:
+    fan1_blue:
+        Action: "Off"
+    fan1_amber:
+        Action: "On"
+
+fan2_ok:
+    fan2_blue:
+        Action: "On"
+    fan2_amber:
+        Action: "Off"
+
+fan2_fail:
+    fan2_blue:
+        Action: "Off"
+    fan2_amber:
+        Action: "On"
+
+fan3_ok:
+    fan3_blue:
+        Action: "On"
+    fan3_amber:
+        Action: "Off"
+
+fan3_fail:
+    fan3_blue:
+        Action: "Off"
+    fan3_amber:
+        Action: "On"
+
+fan4_ok:
+    fan4_blue:
+        Action: "On"
+    fan4_amber:
+        Action: "Off"
+
+fan4_fail:
+    fan4_blue:
+        Action: "Off"
+    fan4_amber:
+        Action: "On"
+
+fan5_ok:
+    fan5_blue:
+        Action: "On"
+    fan5_amber:
+        Action: "Off"
+
+fan5_fail:
+    fan5_blue:
+        Action: "Off"
+    fan5_amber:
+        Action: "On"
+
+fan6_ok:
+    fan6_blue:
+        Action: "On"
+    fan6_amber:
+        Action: "Off"
+
+fan6_fail:
+    fan6_blue:
+        Action: "Off"
+    fan6_amber:
+        Action: "On"
+
+fan7_ok:
+    fan7_blue:
+        Action: "On"
+    fan7_amber:
+        Action: "Off"
+
+fan7_fail:
+    fan7_blue:
+        Action: "Off"
+    fan7_amber:
+        Action: "On"
+
+fan8_ok:
+    fan8_blue:
+        Action: "On"
+    fan8_amber:
+        Action: "Off"
+
+fan8_fail:
+    fan8_blue:
+        Action: "Off"
+    fan8_amber:
+        Action: "On"
+
+fan9_ok:
+    fan9_blue:
+        Action: "On"
+    fan9_amber:
+        Action: "Off"
+
+fan9_fail:
+    fan9_blue:
+        Action: "Off"
+    fan9_amber:
+        Action: "On"
+
+fan10_ok:
+    fan10_blue:
+        Action: "On"
+    fan10_amber:
+        Action: "Off"
+
+fan10_fail:
+    fan10_blue:
+        Action: "Off"
+    fan10_amber:
+        Action: "On"
+
+fan11_ok:
+    fan11_blue:
+        Action: "On"
+    fan11_amber:
+        Action: "Off"
+
+fan11_fail:
+    fan11_blue:
+        Action: "Off"
+    fan11_amber:
+        Action: "On"