*****UPDATE:- HARDWARE HEALTH IS INCLUDED IN NPM 12.2 PLEASE UPGRADE****
IF HARDWARE HEALTH IS MARKED AS CRITICAL ITS KNOWN ISSUE AND DEVELOPMENT TEAM IS CURRENTLY WORKING ON THIS


Hello Everyone.
In this article i have combined the required steps and information in order to monitor the Cisco Cisco ASA Hardware Health and fail-over status in Orion as work around .
If you have any difficulty please let me know .
Please Note: I have Cisco ASA 5506 and result may differ depending on the version and model you have.
Download and import pre-build universal device poller (Attached - Scroll down to the page )
Assign the UNDP Poller to required node and test
Get the poller ID
Custom SWQL Query
Create Custom Query resource
Download the Custom Poller (Attached) and import in the Universal Device Poller
Open Universal Device Poller on the Orion Server >


Once imported > Right click on each Poller > Assign >

Assign it to your ASA > Test > (To make sure its working and valid for the ASA ) > Finish

Get the Poller ID
Now Go to your Cisco ASA Node >(Top Right Corner ) > Click on the "Customize Page" >
Click on the + button > Search for the Resource "Universal Device Poller Status" >
Select Click "Submit"

You will be bale to see the below resource on the Node Details page.

Right Click on the first Poller and Copy Link address

Paste it in the Notepad copy what you need is the PollerID see an example below

Make a list for all the pollers one by one.(Remember Marking and sequence )
Category | Poller Name | Poller ID |
Hardware Health | entPhySensorValue | d3ef4593-7bf3-4cb0-a663-84028d36dca5 |
Hardware Health | entPhysicalName | 2c6c8d51-6e76-4c16-8007-b0c7a4bfbfa9 |
Hardware Health | entPhySensorUnitsDisplay | 4359cd09-0789-4bbe-a705-32d0c35e4af3 |
Hardware Health | ceSensorExtThresholdSeverity | ac89813d-9368-4a1c-a00c-987f9a7cd08c |
Hardware Health | entPhySensorType | ba5b6415-edbc-4a1b-90f3-4930961e5615 |
Hardware Health | ceSensorExtThresholdEvaluation | 43fe9676-5d5a-4a33-8d92-3d755f6b0dee |
FailOver | cfwHardwareInformation | ce86effb-8cf5-4a06-9fa0-00cf54222702 |
FailOver | cfwHardwareStatusDetail | b6fdaae8-0e4c-4258-bd41-0d7037699985 |
FailOver | cfwHardwareStatusValue | 45dd90df-9eb5-4e4c-8eac-cd463a4437c7 |
Create your custom SWQL Query Now change the below SQL Query according to the above Poller ID
*******SWQL FOR Hardware STATUS*******
SELECT Sensor_Names.Value as Name,
CASE Sensor_Type.value
WHEN 10 THEN ToString(Sensor_Values.Value + ' Rpm')
WHEN 12 THEN CASE Sensor_Values.Value WHEN 2 THEN 'DOWN' ELSE 'OK' END
WHEN 8 THEN ToString(Sensor_Values.Value + ' °C')
ELSE ToString(Sensor_Values.Value + ' ' + Sensor_Display.Value)
END as Unit,
--Sensor_Severity.value as Severity,
--Sensor_Status.Value as Status,
CASE Sensor_Type.value
WHEN 8 THEN
CASE Sensor_Status.value
WHEN 0 THEN '/Orion/HardwareHealth/Images/Temperature_Up.png'
ELSE '/Orion/HardwareHealth/Images/Temperature_Down.png'
END
WHEN 10 THEN
CASE Sensor_Status.value
WHEN 0 THEN '/Orion/HardwareHealth/Images/Fan_Up.png'
ELSE '/Orion/HardwareHealth/Images/Fan_Down.png' END
WHEN 12 THEN
CASE Sensor_Status.value
WHEN 0 THEN '/Orion/HardwareHealth/Images/PowerSupply_Up.png'
ELSE '/Orion/HardwareHealth/Images/PowerSupply_Down.png' END
ELSE
CASE Sensor_Status.value
WHEN 0 THEN '/Orion/HardwareHealth/Images/Generic_Up.png'
ELSE '/Orion/HardwareHealth/Images/Generic_Down.png' END
END as [_IconFor_Name]
FROM (
SELECT CS.RowID as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='d3ef4593-7bf3-4cb0-a663-84028d36dca5') AND (CA.NodeID=${NodeID})
) Sensor_Values
LEFT OUTER JOIN (
SELECT CS.RowID as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='2c6c8d51-6e76-4c16-8007-b0c7a4bfbfa9') AND (CA.NodeID=${NodeID})
) Sensor_Names ON Sensor_Names.RowID=Sensor_Values.RowID AND Sensor_Names.NodeID=Sensor_Values.NodeID
LEFT OUTER JOIN (
SELECT CS.RowID as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='4359cd09-0789-4bbe-a705-32d0c35e4af3') AND (CA.NodeID=${NodeID})
) Sensor_Display ON Sensor_Display.RowID=Sensor_Values.RowID AND Sensor_Display.NodeID=Sensor_Values.NodeID
LEFT OUTER JOIN (
SELECT SUBSTRING(CS.RowID, 1, 2) as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='ac89813d-9368-4a1c-a00c-987f9a7cd08c') AND (CA.NodeID=${NodeID})
) Sensor_Status ON Sensor_Status.RowID=Sensor_Values.RowID AND Sensor_Status.NodeID=Sensor_Values.NodeID
LEFT OUTER JOIN (
SELECT CS.RowID as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='ba5b6415-edbc-4a1b-90f3-4930961e5615') AND (CA.NodeID=${NodeID})
) Sensor_Type ON Sensor_Type.RowID=Sensor_Values.RowID AND Sensor_Type.NodeID=Sensor_Values.NodeID
LEFT OUTER JOIN (
SELECT SUBSTRING(CS.RowID, 1, 2) as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='43fe9676-5d5a-4a33-8d92-3d755f6b0dee') AND (CA.NodeID=${NodeID})
) Sensor_Severity ON Sensor_Severity.RowID=Sensor_Values.RowID AND Sensor_Severity.NodeID=Sensor_Values.NodeID
******SWQL FOR FAILOVER STATUS*****
SELECT Caption_Values.Value as Caption,
State_values.Value as State,
CASE Caption_values.RowID
WHEN 6 THEN --Status for primary unit
CASE State_raw.Value
WHEN 1 THEN '/Orion/Images/StatusIcons/Small-Unknown.gif'
WHEN 2 THEN '/Orion/Images/StatusIcons/Small-Up.gif'
WHEN 3 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 4 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 5 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 6 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 7 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 8 THEN '/Orion/Images/StatusIcons/Small-Up-Down.gif'
WHEN 9 THEN '/Orion/Images/StatusIcons/Small-Up.gif'
WHEN 10 THEN '/Orion/Images/StatusIcons/Small-Up-Critical.gif'
ELSE '/Orion/Images/StatusIcons/Small-Unknown.gif'
END
WHEN 4 THEN '/Orion/Images/StatusIcons/Small-Unknown.gif'
WHEN 7 THEN
CASE State_raw.Value
WHEN 1 THEN '/Orion/Images/StatusIcons/Small-Unknown.gif'
WHEN 2 THEN '/Orion/Images/StatusIcons/Small-Up.gif'
WHEN 3 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 4 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 5 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 6 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 7 THEN '/Orion/Images/StatusIcons/Small-Down.gif'
WHEN 8 THEN '/Orion/Images/StatusIcons/Small-Up-Down.gif'
WHEN 9 THEN '/Orion/Images/StatusIcons/Small-Up.gif'
WHEN 10 THEN '/Orion/Images/StatusIcons/Small-Up.gif'
ELSE '/Orion/Images/StatusIcons/Small-Unknown.gif'
END
ELSE '/Orion/Images/StatusIcons/Small-Unknown.gif'
END as [_IconFor_Caption]
FROM (
SELECT CS.RowID as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='ce86effb-8cf5-4a06-9fa0-00cf54222702') AND (CA.NodeID=${NodeId})
) Caption_Values
LEFT OUTER JOIN (
SELECT CS.RowID as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='b6fdaae8-0e4c-4258-bd41-0d7037699985') AND (CA.NodeID=${NodeId})
) State_values ON (Caption_Values.RowID= State_Values.RowID) AND (Caption_Values.NodeID = State_Values.NodeID)
LEFT OUTER JOIN (
SELECT CS.RowID as RowID, IsNull(CS.Status, 0) as Value, CA.NodeID
FROM Orion.NPM.CustomPollerStatus CS
INNER JOIN Orion.NPM.CustomPollerAssignment CA ON CA.CustomPollerAssignmentID = CS.CustomPollerAssignmentID
WHERE (CA.CustomPollerID='45dd90df-9eb5-4e4c-8eac-cd463a4437c7') AND (CA.NodeID=${NodeId})
) State_raw ON (State_Raw.RowID=Caption_Values.RowID) AND (State_Raw.NodeID=Caption_Values.NodeID)
WHERE NodeId=${NodeId}
Create custom query resources
Add "Custom Query" Resource on the Node details page .

Pate the above custom query in two different Custom Resources

Results:
Depending on the ASA version you have will be different


Please be aware following issues resolved under HF 3 in relation to HH and ASA Hardware Health .
SolarWinds Network Performance Monitor 12.2 Hotfix 3 addresses the following issues:
- ASA hardware health sensors show incorrect data
- ASA contexts not polled on some devices
- Filtering issues in the Site-to-Site Tunnels list
- Only the last ASA context is polled if the Show Context command contains the Mode column
- CLLI package session trace logging issues
NPM 12.2 Hotfix 3 - SolarWinds Worldwide, LLC. Help and Support
Download Link for HF 3
https://downloads.solarwinds.com/solarwinds/OfflineInstallers/HF/Solarwinds-Orion-HotFix-2017.3-OfflineInstaller.exe
Kindly make sure you have NPM 12.2 released with HF 3 installed .
If you still have any issue further please contact support.