Digitemp во FreeBSD
В этой части материала мы узнаем как нам извлечь данные с температурного датчика посредством программы Digitemp, сей продукт разрабатывается под лицензией GNU General Public License, соответственно доступен исходный код, имеются сборки под Linux (.deb и .rpm пакеты), Windows(с помощью Cygwin), так же с недавних пор (c 26 июня 2011) появился в портах FreeBSD.
В первой части материала мы рассмотрели создание простого 1-wire адаптера для com-порта компьютера.
Итак мы будем использовать Digitemp в системе FreeBSD 8.1, но Вы без труда сможете его использовать в Linux и в Windows (работу в windows я не проверял) скачав нужный вам пакет.
Подключаем адаптер к com-порту.
Обновляем порты:
# portsnap fetch update
Устанавливаем digitemp:
# cd /usr/ports/misc/digitemp/ && make install clean && rehash
В конце установки инсталлятор выдаст предупреждение.
NOTE: on FreeBSD Digitemp should use /dev/cuau* serial devices, so if running as non-root user, please tune your devfs rules or add running user to «dialer» group which is the default owner of /dev/cuau* devices !
Означающее, что Digitemp использует последовательные устройства /dev/cuau* (* — номер устройства (порта)) и если Вы будете опрашивать эти устройства не от пользователя «root», то пользователя необходимо добавить в группу «dialer».
Проверяем видит ли Digitemp наш адаптер:
# digitemp_DS9097 -q -w -s /dev/cuau0
Где ключи означают следующее: -q — не выводить © -w — пройтись по всем устройствам в сети 1-wire -s — указываем какой серийный порт опрашивать
Если адаптер спаян правильно, то на вывод мы получим следующее:
10F106E901080025 : DS1820/DS18S20/DS1920 Temperature Sensor
Начинаем радоваться, программа увидела наш температурный датчик, с уникальным адресом 10F106E901080025 который относится к семейству датчиков DS1820/DS18S20/DS1920 и является Temperature Sensor.
Далее для работы Digitemp надо создать конфигурационный файл.
Переходим в директорию где хотим сохранить конфигурационный файл:
# cd ~ # digitemp_DS9097 -q -i -s /dev/cuau0
Ключ -i указывает создать конфигурационный файл (файл создастся в директории откуда была запущена команда, имя файла .digitemprc)
Посмотрим конфигурационный файл:
# less .digitemprc TTY /dev/cuau0 READ_TIME 1000 LOG_TYPE 1 LOG_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F" CNT_FORMAT "%b %d %H:%M:%S Sensor %s #%n %C" HUM_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F H: %h%%" SENSORS 1 ROM 0 0x10 0xF1 0x06 0xE9 0x01 0x08 0x00 0x25
Немного разберем его
- TTY — Порт в котором находится наш адаптер
- READ_TIME — Время опроса в миллисекундах
- LOG_TYPE имеет три формата:
1 — Выводить температуру в F° и C° с датой и т.п.
2 — Выводить температуру только в C° и номер датчика
3 — Выводить температуру только в F° и номер датчика - LOG_FORMAT — форматирование вывода, к примеру указанная в конфиге строка «%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F» выведет нам следующее:
May 24 21:25:43 Sensor 0 C: 23.66 F: 74.59
%b — Месяц
%d — День месяца
%H — Час
%M — Минуты
%S — Секунды
%s — Номер датчика, у нас он один, нумерация с нуля
%.2C — Выведет температуру в C° с двумя знаками после запятой
%.2F — Выведет температуру в F° с двумя знаками после запятой - CNT_FORMAT — Формат вывода счетчиков типа DS2423, мы его не используем
- HUM_FORMAT — Форматированный вывод для датчиков влажности типа HIH-4000
- SENSORS 1 — Указывает, что у нас один датчик
- ROM — Собственно ROM нашего датчика
Нас интересует вывод только температуры в C°.
Для этого меняем переменную LOG_TYPE в .digitemprc с 1 на 2.
Запускаем командой:
# digitemp_DS9097 -q -a -c .digitemprc 0 22.62
— 0 номер нашего датчика, 22.62 полученная температура в C°
Создадим скрипт запуска:
# vi /home/scripts/temperature.sh #!/bin/sh # в переменную $line вставляем текущие значения номер датчика и температуры line=`/usr/local/bin/digitemp_DS9097 -q -a -c /path/.digitemprc` # в переменной $temperature оставляем только значение температуры temperature=`echo $line | awk '{print $2}'` # определяем текущею дату для вывода в лог date=`date "+%d.%m.%Y_%H:%M"` # делаем вывод в лог-файл echo $temperature $date >> /var/log/temperature.log
Делаем файл исполняемым:
# chmod +x /home/scripts/temperature.sh
Добавляем в crontab наш скрипт для выполнения раз в 5 минут:
# crontab -e SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin HOME=/var/log #minute hour mday month wday */5 * * * * /home/scripts/temperature.sh >/dev/null 2>&1
Теперь раз в 5 минут наши данные с датчика будут писаться в лог-файл, запись «>/dev/null 2>&1» сделана для того, чтобы данные не отправлялись почтой, в принципе уже можно выводить эти данные куда-нибудь, так же не забываем включить пользователя от которого запускается скрипт отличного от «root» в группу «dialer».
В следующей части мы рассмотрим пакет rrdtool и научимся хранить данные от нашего датчика в RRD (Round-robin Database) и рисовать температурные графики.
Спасибо за подробную статью!
Хотелось бы только отметить, что лог_формат файла .digitemprc позволяет регулировать вывод не прибегая к средствам awk.
Например, такая строка (при всех остальных вводных командной строки) выведет данные в формате для munin:
LOG_FORMAT «sensor%s.value %.2C»
Приветствую! Большое спасибо за дополнение.