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

В этой части статьи мы научимся структурировано сохранять и визуализировать наши данные. Поможет нам в этом — набор утилит rrdtool.
В первой части материала мы рассмотрели создание адаптера 1-wire для последовательного порта компьютера.
Во второй части научились забирать данные с температурного датчика с помощью программы Digitemp.

Поехали:

# 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».

Напишем скрипт для генерации графика:

#!/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, картинка получается больше из-за дополнительных атрибутов (обозначение оси, титула и т.п.).

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

 

Разберем некоторые параметры 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.

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

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

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Комментарии: 5
  1. Rossi25

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

    1. Vladimir (автор)

      Приветствую! Продолжение темы обязательно будет, что касается работы скрипта с несколькими датчиками, то вывод `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. Rossi25

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

  2. Rossi25

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

    1. Vladimir (автор)

      про градиенты:)

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

:) :D :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.