2016-08-24 08:12:20 +01:00
source: Developing/Sensor-State-Support.md
2018-10-27 23:04:34 +01:00
path: blob/master/doc/
2016-02-27 15:29:11 +01:00
# Sensor State Support
### Introduction
In this section we are briefly going to walk through, what it takes to write sensor state support.
We will also briefly get around the concepts of the current sensor state monitoring.
### Logic
For sensor state monitoring, we have 4 DB tables we need to concentrate about.
- sensors
- state_indexes
- state_translations
- sensors_to_state_indexes
We will just briefly tie a comment to each one of them.
2017-11-29 21:34:10 +00:00
#### Sensors
2016-02-27 15:29:11 +01:00
*Each time a sensor needs to be polled, the system needs to know which sensor is it that it need to poll, at what oid is this sensor located and what class the sensor is etc.
This information is fetched from the sensors table.*
#### state_indexes
*Is where we keep track of which state sensors we monitor.*
#### state_translations
*Is where we map the possible returned state sensor values to a generic LibreNMS value, in order to make displaying and alerting more generic.
We also map these values to the actual state sensor(state_index) where these values are actually returned from.*
2017-11-29 21:34:10 +00:00
*The LibreNMS generic states are derived from Nagios:*
2016-02-27 15:29:11 +01:00
```
0 = OK
1 = Warning
2 = Critical
3 = Unknown
```
#### sensors_to_state_indexes
*Is as you might have guessed, where the sensor_id is mapped to a state_index_id.*
### Example
2017-06-26 23:27:57 +01:00
For YAML based state discovery:
```yaml
mib: NETBOTZV2-MIB
modules:
sensors:
state:
2017-11-29 21:34:10 +00:00
data:
-
oid: dryContactSensorTable
value: dryContactSensorValue
2018-11-10 17:45:24 -06:00
num_oid: '.1.3.6.1.4.1.5528.100.4.2.1.1.2.{{ $index }}'
2017-11-29 21:34:10 +00:00
descr: dryContactSensorLabel
2019-01-11 16:42:56 -06:00
group: Contact Sensors
2017-11-29 21:34:10 +00:00
index: 'dryContactSensor.{{ $index }}'
state_name: dryContactSensor
states:
- { value: -1, generic: 3, graph: 0, descr: 'null' }
- { value: 0, generic: 0, graph: 0, descr: open }
- { value: 1, generic: 2, graph: 0, descr: closed }
-
oid: doorSwitchSensorTable
value: doorSwitchSensorValue
2018-11-10 17:45:24 -06:00
num_oid: '.1.3.6.1.4.1.5528.100.4.2.2.1.2.{{ $index }}'
2017-11-29 21:34:10 +00:00
descr: doorSwitchSensorLabel
2019-01-11 16:42:56 -06:00
group: Switch Sensors
2017-11-29 21:34:10 +00:00
index: 'doorSwitchSensor.{{ $index }}'
state_name: doorSwitchSensor
states:
- { value: -1, generic: 3, graph: 0, descr: 'null' }
- { value: 0, generic: 0, graph: 0, descr: open }
- { value: 1, generic: 2, graph: 0, descr: closed }
-
oid: cameraMotionSensorTable
value: cameraMotionSensorValue
2018-11-10 17:45:24 -06:00
num_oid: '.1.3.6.1.4.1.5528.100.4.2.3.1.2.{{ $index }}'
2017-11-29 21:34:10 +00:00
descr: cameraMotionSensorLabel
2019-01-11 16:42:56 -06:00
group: Camera Motion Sensors
2017-11-29 21:34:10 +00:00
index: 'cameraMotionSensor.{{ $index }}'
state_name: cameraMotionSensor
states:
- { value: -1, generic: 3, graph: 0, descr: 'null' }
- { value: 0, generic: 0, graph: 0, descr: noMotion }
- { value: 1, generic: 2, graph: 0, descr: motionDetected }
-
oid: otherStateSensorTable
value: otherStateSensorErrorStatus
2018-11-10 17:45:24 -06:00
num_oid: '.1.3.6.1.4.1.5528.100.4.2.10.1.3.{{ $index }}'
2017-11-29 21:34:10 +00:00
descr: otherStateSensorLabel
index: '{{ $index }}'
state_name: otherStateSensorErrorStatus
states:
- { value: 0, generic: 0, graph: 0, descr: normal }
- { value: 1, generic: 1, graph: 0, descr: info }
- { value: 2, generic: 1, graph: 0, descr: warning }
- { value: 3, generic: 2, graph: 0, descr: error }
- { value: 4, generic: 2, graph: 0, descr: critical }
- { value: 5, generic: 2, graph: 0, descr: failure }
2017-06-26 23:27:57 +01:00
```
2017-11-29 21:34:10 +00:00
### Advanced Example
2017-06-26 23:27:57 +01:00
For advanced state discovery:
2016-02-27 15:29:11 +01:00
This example will be based on a Cisco power supply sensor and is all it takes to have sensor state support for Cisco power supplys in Cisco switches.
The file should be located in /includes/discovery/sensors/state/cisco.inc.php.
```php
<?php
2017-09-03 13:58:39 -05:00
$oids = snmpwalk_group($device, 'ciscoEnvMonSupplyStatusTable', 'CISCO-ENVMON-MIB');
if (!empty($oids)) {
//Create State Index
$state_name = 'ciscoEnvMonSupplyState';
$states = array(
array('value' => 1, 'generic' => 0, 'graph' => 0, 'descr' => 'normal'),
array('value' => 2, 'generic' => 1, 'graph' => 0, 'descr' => 'warning'),
array('value' => 3, 'generic' => 2, 'graph' => 0, 'descr' => 'critical'),
array('value' => 4, 'generic' => 3, 'graph' => 0, 'descr' => 'shutdown'),
array('value' => 5, 'generic' => 3, 'graph' => 0, 'descr' => 'notPresent'),
array('value' => 6, 'generic' => 2, 'graph' => 0, 'descr' => 'notFunctioning'),
);
create_state_index($state_name, $states);
$num_oid = '.1.3.6.1.4.1.9.9.13.1.5.1.3.';
foreach ($oids as $index => $entry) {
//Discover Sensors
discover_sensor($valid['sensor'], 'state', $device, $num_oid.$index, $index, $state_name, $entry['ciscoEnvMonSupplyStatusDescr'], '1', '1', null, null, null, null, $entry['ciscoEnvMonSupplyState'], 'snmp', $index);
//Create Sensor To State Index
create_sensor_to_state_index($device, $state_name, $index);
2016-02-27 15:29:11 +01:00
}
}
```