Температурный датчик DS18s20 (часть 3)

В первой части материала мы рассмотрели создание адаптера 1-wire для последовательного порта компьютера.
Во второй части научились забирать данные с температурного датчика с помощью программы Digitemp.
В этой части статьи мы научимся структурировано сохранять и визуализировать наши данные. Поможет нам в этом — набор утилит rrdtool.Поехали!
# portsnap fetch update
# cd /usr/ports/databases/rrdtool
# make config

Опции rrdtoolВыбираем нужные нам опции, жмем Enter
# make install clean
# rehash 

Создаем директорию для хранения базы rrd.
# mkdir /var/db/rrdtool
Выполняем команду создания нашей базы, команда выполняется в одну строку, символы «\ » являются переносами строк.

Тем самым мы создали нашу базу в /var/db/rrdtool/temperature.rrd с шагом 300(скрипт у нас запускается каждые 5 мин(5мин*60сек=300)), в которой есть один DS (Data Source) с названием temperature, с типом источника GAUGE, который нам больше всего подходит, т.к. может хранить произвольные числа. Так же в DS у нас описаны четыре RRA (round robin archives), по примеру:
RRA:функция_консолидации:доля:отсчетов_на_ячейку:число_ячеек.

Немного переделываем наш скрипт, который мы писали во второй части статьи.
# vi /home/scripts/temperature.sh

Если скрипт отработал без ошибок, значит Вы все сделали правильно, если нет, то проверьте пути до программ и конфигурационного файла.

Теперь попробуем создать график для отображения наших данных.
В вышеуказанных примерах, мы использовали утилиту rrdtool с аргументами «create» и «update». Для создания графиков мы будем использовать rrdtool c аргументом «graph».
Напишем скрипт для генерации графика:
# vi /home/scripts/graphcreate.sh

# chmod +x /home/scripts/graphcreate.sh
Создадим директорию для сохранения файла с графиком
# mkdir /usr/local/www/temperature
/home/scripts/graphcreate.sh
466×298

466X298 – это размер созданного .png файла, хотя мы в скрипте описали параметры —widht 400 и —height 250, картинка получается больше из-за дополнительных атрибутов (обозначение оси, титула и т.п.).
Вот что у меня получилось

Разберем некоторые параметры rrdgraph:

  • —width 400 — Ширина в px
  • —height 250 — Высота в px
  • —font TITLE:13 — Размер шрифта в заголовке
  • —color BACK#444444 — Цвет фона
  • —color SHADEA#444444 — Цвет верхней и левой границы
  • —color SHADEB#444444 — Цвет нижней и привой границы
  • —color CANVAS#444444 — Цвет холста
  • —color FONT#ff7518 — Цвет шрифта
  • —slope-mode — Включить сглаживание
  • —start -1d — За какой период генерировать график, мы указали за сутки
  • —end now — Конец временного интервала графика  (т.е. используя время в at-формате или формате Unix мы можем построить график за любой период)
  • —units-exponent 0 — Задаем единицы измерения по оси Y (0 — единицы, 1 — 1000, 2 — 10000 и т.д.)
  • —vertical-label «Температура, C°» — Подпись вертикальной оси
  • —title «Температура за сутки»  — Заголовок графика
  • —imgformat PNG  — Формат выходного файла  .png
  • DEF:temperature=/var/db/rrdtool/temperature.rrd:temperature:AVERAGE — Создаем переменную «temperature»
  • LINE1:temperature#00ff00:»» —  Задаем линию графика (толщину 1 и цвет #00ff00), после двоеточия в кавычках можно вписать название, на графике это будет использоваться как легенда
  • GPRINT:temperature:LAST:»Текущая:%3.2lfC°» — Выводим в подпись температуру, которая может быть: последней, средней, максимальной, минимальной

Выведем график с помощью веб-сервера Apache (предполагается, что Apache у вас уже настроен и запущен, все пути в этой статье указывают на дефолтные настройки Apache).
Создадим статичную страницу HTML.
# vi /usr/local/www/temperature/temperature.html

Заходим на созданную страницу http://my_domen/temperature/temperature.html,
мы должны увидеть примерно следующее:
Осталось поместить в crontab расписания запуска нашего скрипта, генерирующего график /home/scripts/graphcreate.sh, либо вызывать его из скрипта получающие данные с температурного датчика или объединить эти скрипты. 

В следующих статьях рассмотрим возможность генерации графика через CGI и возможность создавать на графике градиентные заливки в зависимости от температуры.

Температурный датчик DS18s20 (часть 3): 5 комментариев

  1. Ждем с нетерпением появления продолжения этой темы в виде реализации градиентной заливки… И будет ли работать этот скрипт, если датчиков больше одного(например 2) — temperature=echo $line | awk '{print $2}' выдаст столбец?

    1. Приветствую! Продолжение темы обязательно будет, что касается работы скрипта с несколькими датчиками, то вывод echo $line | awk ‘{print $2}’ Вам даст температуру первого датчика(print $1 — номер датчика 0,1,2), print $4 — второго и т.д., при условии, что Вы настраивали Digitemp по моей статье иначе номер элементов $1,$2 может быть другой, для каждого датчика надо определить свою переменную:
      temperature0=echo $line | awk ‘{print $2}’
      temperature1=echo $line | awk ‘{print $4}’
      temperature2=echo $line | awk ‘{print $6}’
      И по этим переменным дальше строить либо отдельные графики или все линии помещать на одном графике.
      На данный момент у меня работает такой скрипт с 3 датчиками.

      1. Да, согласен с выводом. Просто я у себя решил использовать в выводе полное имя датчика — может заменить надо будет датчик и чтоб наверняка знать, с какого датчика показания.
        Я использую для вывода значений следющее:
        digitemp_DS9097 -q -a -o «%R: %.C» -c /usr/local/etc/digitemp.conf
        283C08DE03000040: 28
        2836EBDD03000093: 28

  2. У меня получился пока скрипт отправки на почту при превышении пороговых значений температуры. Вот бы графики красивые градиентные туда прикрутить. Получится на openwrt, чтоб по адресу типа http://router/sens открывались? http://narod.ru/disk/56107854001.97f1e1a9adb940e8eac19321bd538250/sensor.tar.html
    Процесс изготовления датчиков описал коротко тут — http://wl500g.info/showthread.php?18254-%D0%EE%F3%F2%E5%F0-%F1%EB%E5%E4%E8%F2-%E7%E0-%F2%E5%EC%EF%E5%F0%E0%F2%F3%F0%EE%E9-%28digitemp-amp-owfs%29&p=252854&langid=3#post252854

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *