2017-04-25 18:35:42 +01:00
source: Developing/os/Health-Information.md
2018-10-27 23:04:34 +01:00
path: blob/master/doc/
2017-04-25 18:35:42 +01:00
2017-06-26 23:27:57 +01:00
#### Sensors
2017-04-25 18:35:42 +01:00
This document will guide you through adding health / sensor information for your new device.
Currently we have support for the following health metrics along with the values we expect to see the data in:
| Class | Measurement |
| ------------------------------- | --------------------------- |
| airflow | cfm |
2018-05-02 12:34:13 -07:00
| ber | ratio |
2017-04-25 18:35:42 +01:00
| charge | % |
2018-05-02 12:34:13 -07:00
| chromatic_disperision | ps/nm |
2017-09-29 21:13:27 +01:00
| cooling | W |
2019-01-20 19:24:11 +01:00
| count | # |
2017-04-25 18:35:42 +01:00
| current | A |
| dbm | dBm |
2018-05-02 12:34:13 -07:00
| delay | s |
| eer | eer |
2017-04-25 18:35:42 +01:00
| fanspeed | rpm |
| frequency | Hz |
| humidity | % |
| load | % |
| power | W |
2019-01-20 19:24:11 +01:00
| power_consumed | kWh |
| power_factor | ratio |
2017-09-29 21:13:27 +01:00
| pressure | kPa |
2018-05-02 12:34:13 -07:00
| quality_factor | dB |
2017-04-25 18:35:42 +01:00
| runtime | Min |
| signal | dBm |
2017-06-26 23:27:57 +01:00
| snr | SNR |
2017-04-25 18:35:42 +01:00
| state | # |
| temperature | C |
| voltage | V |
2018-01-18 21:50:19 +01:00
| waterflow | l/m |
2017-04-25 18:35:42 +01:00
2017-06-26 23:27:57 +01:00
#### Simple health discovery
We have support for defining health / sensor discovery using YAML files so that you don't need to know how to write PHP.
2017-07-22 15:03:11 +01:00
> Please note that DISPLAY-HINTS are disabled so ensure you use the correct divisor / multiplier if applicable.
2018-06-19 02:57:23 -04:00
All yaml files are located in `includes/definitions/discovery/$os.yaml` . Defining the information here is not always
2017-06-26 23:27:57 +01:00
possible and is heavily reliant on vendors being sensible with the MIBs they generate. Only snmp walks are supported
and you must provide a sane table that can be traversed and contains all of the data you need. We will use netbotz as
an example here.
`includes/definitions/discovery/netbotz.yaml`
```yaml
mib: NETBOTZV2-MIB
modules:
sensors:
airflow:
2017-07-10 22:27:46 +01:00
options:
skip_values_lt: 0
data:
-
oid: airFlowSensorTable
value: airFlowSensorValue
divisor: 10
2018-11-10 17:45:24 -06:00
num_oid: '.1.3.6.1.4.1.5528.100.4.1.5.1.2.{{ $index }}'
2019-03-05 04:17:14 +01:00
descr: '{{ $airFlowSensorLabel }}'
2017-07-10 22:27:46 +01:00
index: 'airFlowSensorValue.{{ $index }}'
2017-06-26 23:27:57 +01:00
```
At the top you can define one or more mibs to be used in the lookup of data:
`mib: NETBOTZV2-MIB`
2017-07-10 22:27:46 +01:00
For `data:` you have the following options:
2017-06-26 23:27:57 +01:00
The only sensor we have defined here is airflow. The available options are as follows:
- `oid` (required): This is the name of the table you want to do the snmp walk on.
2017-07-10 22:27:46 +01:00
- `value` (optional): This is the key within the table that contains the value. If not provided will use `oid`
2018-12-23 15:50:51 -06:00
- `num_oid` (required): This is the numerical OID that contains `value` . This should always include `{{ $index }}` . snmptranslate -On can help figure out the number
2017-06-26 23:27:57 +01:00
- `divisor` (optional): This is the divisor to use against the returned `value` .
- `multiplier` (optional): This is the multiplier to use against the returned `value` .
2018-04-14 03:43:40 +01:00
- `low_limit` (optional): This is the critical low threshold that `value` should be (used in alerting). If an OID is specified then divisor / multiplier are used.
- `low_warn_limit` (optional): This is the warning low threshold that `value` should be (used in alerting). If an OID is specified then divisor / multiplier are used.
- `warn_limit` (optional): This is the warning high threshold that `value` should be (used in alerting). If an OID is specified then divisor / multiplier are used.
- `high_limit` (optional): This is the critical high threshold that `value` should be (used in alerting). If an OID is specified then divisor / multiplier are used.
2019-03-05 04:17:14 +01:00
- `descr` (required): The visible label for this sensor. It can be a key with in the table or a static string, optionally using `{{ index }}` .
2019-01-11 16:42:56 -06:00
- `group` (optional): Groups sensors together under in the webui, displaying this text. Not specifying this will put the sensors in the default group.
2017-06-26 23:27:57 +01:00
- `index` (optional): This is the index value we use to uniquely identify this sensor. `{{ $index }}` will be replaced by the `index` from the snmp walk.
2017-12-02 22:56:57 +00:00
- `skip_values` (optional): This is an array of values we should skip over (see note below).
2017-07-10 22:27:46 +01:00
- `skip_value_lt` (optional): If sensor value is less than this, skip the discovery.
- `skip_value_gt` (optional): If sensor value is greater than this, skip the discovery.
2017-12-02 22:56:57 +00:00
- `entPhysicalIndex` (optional): If the sensor belongs to a physical entity then you can specify the index here.
- `entPhysicalIndex_measured` (optional): If the sensor belongs to a physical entity then you can specify the entity type here.
- `user_func` (optional): You can provide a function name for the sensors value to be processed through (i.e. Convert fahrenheit to celsius use `fahrenheit_to_celsius` )
2017-07-10 22:27:46 +01:00
For `options:` you have the following available:
- `divisor` : This is the divisor to use against the returned `value` .
- `multiplier` : This is the multiplier to use against the returned `value` .
2017-12-02 22:56:57 +00:00
- `skip_values` : This is an array of values we should skip over (see note below).
2017-07-10 22:27:46 +01:00
- `skip_value_lt` : If sensor value is less than this, skip the discovery.
- `skip_value_gt` : If sensor value is greater than this, skip the discovery.
2017-06-26 23:27:57 +01:00
2019-03-05 04:17:14 +01:00
Multiple variables can be used in the sensors definition. The syntax is `{{ $variable }}` . Any oid in the current
table can be used, as well as pre_cached data. The index ($index) and the sub_indexes
(in case the oid is indexed multiple times) are also available: if $index="1.20", then
$subindex0="1" and $subindex1="20".
2017-12-02 22:56:57 +00:00
> `skip_values` can also compare items within the OID table against values. One example of this is:
```yaml
skip_values:
-
oid: sensUnit
op: '!='
value: 4
```
2017-06-26 23:27:57 +01:00
If you aren't able to use yaml to perform the sensor discovery, you will most likely need to use Advanced health discovery.
#### Advanced health discovery
If you can't use the yaml files as above, then you will need to create the discovery code in php.
2017-04-25 18:35:42 +01:00
The directory structure for sensor information is `includes/discovery/sensors/$class/$os.inc.php` . The format of all
of the sensors follows the same code format which is to call the `discover_sensor()` function - with the
exception of state which requires additional code.
`discover_sensor()` Accepts the following arguments:
- &$valid = This is always $valid['sensor'], do not pass any other values.
- $class = Required. This is the sensor class from the table above (i.e humidity).
- $device = Required. This is the $device array.
- $oid = Required. This must be the numerical OID for where the data can be found, i.e .1.2.3.4.5.6.7.0
- $index = Required. This must be unique for this sensor class, device and type.
Typically it's the index from the table being walked or it could be the name of the OID if it's a single value.
- $type = Required. This should be the OS name, i.e pulse.
- $descr = Required. This is a descriptive value for the sensor. Some devices will provide names to use.
feature: Wireless Sensors Overhaul (#6471)
* feature: Wireless Sensors
Includes client counts for ios and unifi
Graphing could use some improvement.
Alerting and threshold ui not implemented
WIP: starting OO based wireless sensors.
Class based functionality working
remove old functional files
add schema file
discovery needs to be enabled, not polling
fix up schema
fix Unifi discovery not returning an array
Add some debug when discovering a sensor.
Fix style.
Add missing semicolin
Add a null object (Generic) for OS.
Fill out some phpdocs
Re-organized code
Each sensor type now has it's own discovery and polling interface
Custom polling tested with Unifi CCQ
Left to do:
Implement UI (Graphs and Custom thresholds)
Alerting
Testing
Fix event message text
Remove runDiscovery and runPolling from OS, they are unused and don't belong there.
Cleanups/docs
Missed this file.
Remove the requirement to fetch the current value to check validity.
Do that automatically if current is not specified
A few cleanups here and there
First pass at graphing.
device_ and wireless_ graphs added.
Add RouterOS support
Singleton OS instance isn't required right now.
Remove that to allow some memory to be freed.
Add wireless to the device list metrics.
Make all metrics clickable
Tweak graphs a bit
Implement limit configuration page.
Use sensors page as common code instead of duplicating.
Clean up some javascript interactions: Allow enter on values to save. Cancel if update is not needed. Enable the clear custom button after setting a custom value.
Add some wireless alert rules to the library.
Add documentation.
Add unifi client counts by ssid in addition to radio.
Optimize Sensor polling a bit.
Add HP MSM clients support (for full controller)
Fix function accessibility
Formalize the discovery and poller interfaces.
Add Xirrus clients and noise floor
move module interfaces to a more appropriate place.
push caching code up to os, unsure about this do to the limitations
No point in selectively enabling wireless discovery. We only discover if the device supports something.
Add RSSI, Power, and Rate.
Add these sensors for Ubnt Airos.
Clean up some copyrights.
Reduce the amount of files need to add new types.
Leave graph files for consistency and to allow customization.
Remove the old wifi clients graph completely.
ciscowlc should have improved counts (total and per-ssid)
Schema didn't get added.
Impelement the rest of the AirOS sensors
Reformat and re-organize the Airos.php class.
Add several UBNT AirFiber sensors
A few fixes add links to the section headers
Add HP MSM mibs.
* Schema file got dropped in rebase.
* Add wireless menu to view sensors across all devices.
Icons in the menu need help :/
* Add HeliOS, Mimosa, and Siklu support
Sensors added SNR + Noise
* Add power and utilization to Unifi
* Update polling to prefetch all sensor data in a few snmp requests as possible
* Add Extendair: tx+rx power, aggregate rate, frequency
* Add a check for duplicate sensors in discovery. Just print an error for now.
* Add Bit Error Ratio (named error-ratio to allow for bit error rate to be added if needed)
Fix an incorrect link in the wireless sensors table
* Add error rate and change all bps and Hz to use si units
* Fixes to limits and frequency display
* Fix overview graph frequency display
A few decimal place tweaks
* Don't allow switching sensor and wireless-sensor graphs, it doesn't work.
Change individual distance graphs to use si units
* Go through the OS and make sure I got all the sensors I can (probably missed some still)
Because pollWirelessChannelAsFrequency() is generic and a little complex, so pull it up to OS.
Message to help developers adding supports that don't return an array from discover functions.
* Fix some issues
* Remove noise and signal for now at least
A couple more fixes
Add a notification
* Oopsie
* Bonus AirFiber sensors
2017-05-01 23:49:11 -05:00
- $divisor = Defaults to 1. This is used to divided the returned value.
2017-04-25 18:35:42 +01:00
- $multiplier = Defaults to 1. This is used to multiply the returned value.
- $low_limit = Defaults to null. Sets the low threshold limit for the sensor, used in alerting to report out range sensors.
- $low_warn_limit = Defaults to null. Sets the low warning limit for the sensor, used in alerting to report near out of range sensors.
- $warn_limit = Defaults to null. Sets the high warning limit for the sensor, used in alerting to report near out of range sensors.
- $high_limit = Defaults to null. Sets the high limit for the sensor, used in alerting to report out range sensors.
- $current = Defaults to null. Can be used to set the current value on discovery. Poller will update this on the next poll cycle anyway.
- $poller_type = Defaults to snmp. Things like the unix-agent can set different values but for the most part this should be left as snmp.
- $entPhysicalIndex = Defaults to null. Sets the entPhysicalIndex to be used to look up further hardware if available.
- $entPhysicalIndex_measured = Defaults to null. Sets the type of entPhysicalIndex used, i.e ports.
2019-01-11 16:42:56 -06:00
- $user_func = Defaults to null. You can provide a function name for the sensors value to be processed through (i.e. Convert fahrenheit to celsius use `fahrenheit_to_celsius` )
- $group = Defaults to null. Groups sensors together under in the webui, displaying this text.
2017-04-25 18:35:42 +01:00
For the majority of devices, this is all that's required to add support for a sensor. Polling is done based on the data gathered using `discover_sensor()` .
If custom polling is needed then the file format is similar to discovery: `includes/polling/sensors/$class/$os.inc.php` . Whilst it's possible to perform additional
snmp queries within polling this should be avoided where possible. The value for the OID is already available as `$sensor_value` .
2017-12-02 22:56:57 +00:00
Graphing is performed automatically for sensors, no custom graphing is required or supported.