Skip to content

Sensor State Support

Introduction

This section describes the implementation of sensor state support. It also describes the basic concepts of sensor state monitoring.

LibreNMS converts the raw values to generic states: "OK", "Warning", "Critical", and "Unknown". These states give a consistent display and a simpler analysis.

Key Concepts

Sensor state monitoring uses 4 database tables. These tables connect the raw information of each sensor to the standard representation, that is the generic state. LibreNMS uses the generic state for the display and for the alerts.

Table: sensors

This table gives the sensor of each poll. It holds the description of the sensor, its OID, and its class. It applies to every sensor type.

Table: sensors_to_state_indexes

This table maps each sensor_id to a state_index_id.

Table: state_indexes

This table holds the state information of the monitoring.

Table: state_translations

This table maps each state sensor value to a generic LibreNMS value. The display and the alerts are then generic. It also maps each value to the state sensor (state_index) of that value.

The LibreNMS generic states come from Nagios:

0 = OK
1 = Warning
2 = Critical
3 = Unknown

### Generic States translations

A sensor state arrives over SNMP as a string or as a number. LibreNMS handles both forms.

If the sensor state input is a string, such as "ONLINE", LibreNMS uses the 'descr' field. It then converts the value to the generic state 0, 1, 2, or 3: - { value: 4, descr: online, graph: 1, generic: 0 }

If the sensor state input is a number, such as "4" for the offline state, LibreNMS uses the 'value' field. It then converts the value to the generic state 0, 1, 2, or 3:
- { value: 0, descr: offline, graph: 1, generic: 2 }

Note

Here, the descr field is only a label on the screen. It is not the input of the conversion, because the state input is a number.

YAML Example

For YAML based state discovery:

modules:
    sensors:
        state:
            data:
                -
                    oid: NETBOTZV2-MIB::dryContactSensorTable
                    value: NETBOTZV2-MIB::dryContactSensorValue
                    num_oid: '.1.3.6.1.4.1.5528.100.4.2.1.1.2.{{ $index }}'
                    descr: NETBOTZV2-MIB::dryContactSensorLabel
                    group: Contact Sensors
                    index: 'dryContactSensor.{{ $index }}'
                    state_name: NETBOTZV2-MIB::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: NETBOTZV2-MIB::doorSwitchSensorTable
                    value: NETBOTZV2-MIB::doorSwitchSensorValue
                    num_oid: '.1.3.6.1.4.1.5528.100.4.2.2.1.2.{{ $index }}'
                    descr: NETBOTZV2-MIB::doorSwitchSensorLabel
                    group: Switch Sensors
                    index: 'doorSwitchSensor.{{ $index }}'
                    state_name: NETBOTZV2-MIB::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: NETBOTZV2-MIB::cameraMotionSensorTable
                    value: NETBOTZV2-MIB::cameraMotionSensorValue
                    num_oid: '.1.3.6.1.4.1.5528.100.4.2.3.1.2.{{ $index }}'
                    descr: NETBOTZV2-MIB::cameraMotionSensorLabel
                    group: Camera Motion Sensors
                    index: 'cameraMotionSensor.{{ $index }}'
                    state_name: NETBOTZV2-MIB::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: NETBOTZV2-MIB::otherStateSensorTable
                    value: NETBOTZV2-MIB::otherStateSensorErrorStatus
                    num_oid: '.1.3.6.1.4.1.5528.100.4.2.10.1.3.{{ $index }}'
                    descr: NETBOTZV2-MIB::otherStateSensorLabel
                    index: '{{ $index }}'
                    state_name: NETBOTZV2-MIB::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 }

Advanced Example

For advanced state discovery:

This example uses a Cisco power supply sensor. It gives full sensor state support for the power supplies of Cisco switches. Put the file in /includes/discovery/sensors/state/cisco.inc.php.

<?php

$oids = SnmpQuery::hideMib()->walk('CISCO-ENVMON-MIB::ciscoEnvMonSupplyStatusTable')->valuesByIndex;

if (!empty($oids)) {
    //Create State Index
    $state_name = 'CISCO-ENVMON-MIB::ciscoEnvMonSupplyState';
    $states = [
        ['value' => 1, 'generic' => 0, 'graph' => 0, 'descr' => 'normal'],
        ['value' => 2, 'generic' => 1, 'graph' => 0, 'descr' => 'warning'],
        ['value' => 3, 'generic' => 2, 'graph' => 0, 'descr' => 'critical'],
        ['value' => 4, 'generic' => 3, 'graph' => 0, 'descr' => 'shutdown'],
        ['value' => 5, 'generic' => 3, 'graph' => 0, 'descr' => 'notPresent'],
        ['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(null, 'state', $device, $num_oid.$index, $index, $state_name, $entry['ciscoEnvMonSupplyStatusDescr'], '1', '1', null, null, null, null, $entry['ciscoEnvMonSupplyState'], 'snmp', $index);
    }
}