В этой части статьи мы научимся структурировано сохранять и визуализировать наши данные. Поможет нам в этом — набор утилит rrdtool.
В первой части материала мы рассмотрели создание адаптера 1-wire для последовательного порта компьютера.
Во второй части научились забирать данные с температурного датчика с помощью программы Digitemp.
Поехали:
# portsnap fetch update # cd /usr/ports/databases/rrdtool # make config
Выбираем нужные нам опции, жмем 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».
Напишем скрипт для генерации графика:
#!/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 466x298
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 и возможность создавать на графике градиентные заливки в зависимости от температуры.
Ждем с нетерпением появления продолжения этой темы в виде реализации градиентной заливки… И будет ли работать этот скрипт, если датчиков больше одного(например 2) — temperature=`echo $line | awk ‘{print $2}’` выдаст столбец?
Приветствую! Продолжение темы обязательно будет, что касается работы скрипта с несколькими датчиками, то вывод `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 датчиками.
Да, согласен с выводом. Просто я у себя решил использовать в выводе полное имя датчика — может заменить надо будет датчик и чтоб наверняка знать, с какого датчика показания.
Я использую для вывода значений следющее:
digitemp_DS9097 -q -a -o «%R: %.C» -c /usr/local/etc/digitemp.conf
283C08DE03000040: 28
2836EBDD03000093: 28
У меня получился пока скрипт отправки на почту при превышении пороговых значений температуры. Вот бы графики красивые градиентные туда прикрутить. Получится на 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
про градиенты:)