[comment]: # ({05069cfc-05069cfc})
# 8. Датчики

Каждый контроллер имеет свой собственный каталог в дереве sysfs /sys/devices.
Чтобы найти все контроллеры, проще перейти по символическим ссылкам на устройства из /sys/class/hwmon/hwmon\*, где \* — это конкретный номер (0,1,2,...).

Показания датчиков находятся либо в папке /sys/class/hwmon/hwmon\*/
для виртуальных устройств, либо в папке /sys/class/hwmon/hwmon\*/device
для невиртуальных устройств. Файл с именем name, расположенный в папках
hwmon\* или hwmon\*/device, содержит имя чипа, которое соответствует имени используемого контроллером драйвера ядра.

В каждом файле имеется только одно значение показания датчика. Общая схема
именования файлов, которые содержат показания датчиков, внутри любой из вышеупомянутых папок:
<тип><номер>\_<элемент>, где

-   **тип** — для чипов датчиков это "in" (напряжение), "temp" (температура),
    "fan" (скорость вентилятора) и т.д.,
-   **элемент** — "input" (измеренное значение), "max" (верхний порог), "min"
    (нижний порог) и т.д.,
-   **номер** — всегда используется для экземпляров, которые могут присутствовать более 
    одного раза (обычно начинается с 1, за исключением датчиков напряжения, которые начинаются с
    0). Если файлы не относятся к конкретным экземплярам, они имеют простое наименование без номера.

Информацию о датчиках, доступных на хосте, можно получить
с помощью инструментов **sensor-detect** и **sensors**  (пакет lm-sensors:
<http://lm-sensors.org/>). **Sensors-detect** помогает определить, какие модули необходимы для доступных датчиков. Когда модули загружены, можно использовать утилиту
**sensors**, чтобы показать значения со всех контроллеров. Маркировка значений датчиков, используемая данной утилитой, может отличаться от общепринятой схемы именования
(<тип><номер>\_<элемент>):

-   если имеется файл с именем <тип><номер>\_метка, то
    метка внутри этого файла будет использоваться вместо имени
    <тип><номер>\_<элемент>;
-   если файл <тип><номер>\_метка отсутствует, то
    утилита выполняет поиск внутри /etc/sensors.conf (также может быть
    /etc/sensors3.conf или другой) для подстановки имени.

Эта маркировка позволяет пользователю определить тип используемого оборудования. Если нет ни файла
<тип><номер>\_метка, ни метки внутри файла конфигурации,
то тип оборудования может быть определён по атрибуту
name (hwmon\*/device/name). Реальные имена датчиков, которые воспринимает
zabbix\_agent, можно получить, запустив утилиту **sensors** с параметром
«-u» (**sensors -u**).

В утилите **sensor** доступные датчики разделены по типу шины
(ISA adapter, PCI adapter, SPI adapter, Virtual device, ACPI
interface, HID adapter).

[comment]: # ({/05069cfc-05069cfc})

[comment]: # ({61bf6279-61bf6279})
##### В Linux 2.4:

(Показания датчиков извлекаются из папки /proc/sys/dev/sensors)

-   **устройство** — имя устройства (если <режим> используется,
    это регулярное выражение);
-   **сенсор** — имя датчика (если используется <режим>, это
    регулярное выражение);
-   **режим** — возможные значения: avg, max, min (если этот параметр не
    указан, устройство и сенсор обрабатываются буквально).

Пример ключа: sensor\[w83781d-i2c-0-2d,temp1\]

До версии Zabbix 1.8.4 использовался следующий формат: sensor\[temp1\].

[comment]: # ({/61bf6279-61bf6279})

[comment]: # ({2e1edda6-2e1edda6})
##### В Linux 2.6+:

(Показания датчиков извлекаются из папки /sys/class/hwmon)

-   **device** — имя устройства (не регулярное выражение). Имя устройства
    может быть фактическим именем устройства (e.g 0000:00:18.3) или именем,
    полученным при использовании утилиты sensors (e.g. k8temp-pci-00c3). Выбор того,
    какое из этих имён использовать, оставлен за пользователем;
-   **sensor** — имя датчика (не регулярное выражение);
-   **mode** — возможные значения: avg, max, min (если этот параметр не указан,
    устройство и сенсор обрабатываются буквально).

Примеры ключей:

sensor\[k8temp-pci-00c3,temp,max\] или sensor\[0000:00:18.3,temp1\]

sensor\[smsc47b397-isa-0880,in,avg\] или sensor\[smsc47b397.2176,in1\]

[comment]: # ({/2e1edda6-2e1edda6})

[comment]: # ({3af7f5c1-0cb28aa9})
#### Получение имён датчиков

Метки датчиков не всегда могут быть использованы непосредственно в том виде, как
они выводятся утилитой *sensors*, т.к. именование меток может отличаться у
каждого производителя контроллеров. Например, вывод утилиты *sensors* может
содержать следующие строки:

    $ sensors
    in0:         +2.24 V  (min =  +0.00 V, max =  +3.32 V)   
    Vcore:       +1.15 V  (min =  +0.00 V, max =  +2.99 V)   
    +3.3V:       +3.30 V  (min =  +2.97 V, max =  +3.63 V)   
    +12V:       +13.00 V  (min =  +0.00 V, max = +15.94 V)
    M/B Temp:    +30.0°C  (low  = -127.0°C, high = +127.0°C)

Из этих строк только одна строка может использоваться непосредственно:

    $ zabbix_get -s 127.0.0.1 -k sensor[lm85-i2c-0-2e,in0]
    2.240000

Попытки использовать остальные метки (такие как *Vcore* или *+12V*) работать не будут.

    $ zabbix_get -s 127.0.0.1 -k sensor[lm85-i2c-0-2e,Vcore]
    ZBX_NOTSUPPORTED

Чтобы найти фактическое имя датчика, которое можно использовать в Zabbix для
получения его показаний, запустите *sensors -u*. В полученном выводе можно
увидеть следующее:

    $ sensors -u
    ...
    Vcore:
      in1_input: 1.15
      in1_min: 0.00
      in1_max: 2.99
      in1_alarm: 0.00
    ...    
    +12V:
      in4_input: 13.00
      in4_min: 0.00
      in4_max: 15.94
      in4_alarm: 0.00
    ...

Таким образом, *Vcore* может быть опрошен как *in1*, а *+12V* должен опрашиваться как *in4*.
[^1]: Согласно [спецификации \[en\]](https://www.kernel.org/doc/Documentation/hwmon/sysfs-interface), это напряжения на выводах микросхемы и, в общем случае, может понадобиться масштабирование.

    $ zabbix_get -s 127.0.0.1 -k sensor[lm85-i2c-0-2e,in1]
    1.301000

В Zabbix можно получать не только показания напряжения (in), но также тока (curr), температуры (temp) и скорости вращения вентилятора (fan).

[comment]: # ({/3af7f5c1-0cb28aa9})
