Температурный датчик 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
Выполняем команду создания нашей базы, команда выполняется в одну строку, символы “\ ” являются переносами строк.

/usr/local/bin/rrdtool create /var/db/rrdtool/temperature.rrd --step 300 \
DS:temperature:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460\

Тем самым мы создали нашу базу в /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

#!/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
#Наполняем нашу базу
/usr/local/bin/rrdtool update /var/db/rrdtool/temperature.rrd N:$temperatere

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

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

#!/bin/sh
#Экспортируем нашу локаль, у меня KOI-8, свою локаль Вы можете проверить командой "locale"
#без этого на график не получится вывести кириллические символ
export LANG=KOI8-R
export LC_ALL=ru_RU.KOI8-R
#Строим график либо все в одну строку, либо через разделитель " ", комментарии в строке вызовут ошибку
rrdtool graph 
/usr/local/www/temperature/test.png 
--width 400 
--height 250 
--font TITLE:13 
--color BACK#444444 
--color SHADEA#444444 
--color SHADEB#444444 
--color CANVAS#444444 
--color FONT#ff7518 
--slope-mode 
--start -1d 
--end now 
--units-exponent 0 
--vertical-label "Температура, C°" 
--title "Температура за сутки" 
--imgformat PNG 
DEF:temperature=/var/db/rrdtool/temperature.rrd:temperature:AVERAGE 
LINE1:temperature#00ff00:"" 
GPRINT:temperature:LAST:"Текущая:%3.2lfC°" GPRINT:temp_0:AVERAGE:"Средняя:%3.2lfC°" GPRINT:temp_0:MAX:"Максимальная:%3.2lfC°" GPRINT:temp_0:MIN:"Минимальная:%3.2lfC°j" 
HRULE:0#00ffff

# 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

<html>
<title>Наша температура</title>
</html>
<body>
<h1 align="center">Температура за сутки</h1>
<div align="center">
<img src="test.png">
</div>
</body>

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

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

0 0 голосовать
Рейтинг статьи
Подписаться
Уведомление о
guest
5 Комментарий
Oldest
Newest Most Voted
Встроенные отзывы
Просмотр всех комментариев
Rossi25
Rossi25
7 лет назад

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

Rossi25
Rossi25
7 лет назад
Ответить на  Vladimir

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

Rossi25
Rossi25
7 лет назад

У меня получился пока скрипт отправки на почту при превышении пороговых значений температуры. Вот бы графики красивые градиентные туда прикрутить. Получится на 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