Мониторинг температуры с помощью rrdtool
Возникла идея прикрутить датчик температуры, что бы мониторить текущую температуру за окном, а так же строить графики зависимости температуры от времени.
Первым делом займемся созданием датчика температуры, который будет висеть на COM-порту. Схема довольно простая, взята тут:
Список необходимых радиодеталей:
1. DS18B20 - сам датчик температуры.
2. D1 - стабилитрон 3.9v.
3. D2 - стабилитрон 6.2v.
4. D3,D4 - диод Шоттки 1N5818.
5. D5 - диод 1N4148.
6. D6 - стабилитрон 5.6v.
7. C1 - конденсатор 10uF x 16v.
8. R1 - резистор 1.5k.
9. COM-порт (9 контактов), тип - мама.
10. Корпус для разьема COM.
В суме за все детали отдал около 5$.
Распиновка:
1. Распиновка датчика DS18B20.
DQ - данные
VDD - "+" питания
2. Диод и стабилитрон:
Черная полоса на конце того и другого, означает "минус" - катод.
3. Конденсатор:
Он имеет белую полоску с знаком " - ", необходимо соблюдать полярность!
При пайке, все элементы разместил в корпусе COM-разъема, наружу вынес только датчик температуры. Данная схема не требует никаких настроек.
В результате вот, что должно получится:
На этим хардварная часть завершена, переходим к софту.
Установка для Linux:
Снимать показания температуры будем с помощью программы digitemp-3.2.0, так как последняя версия отказалась работать.
Распаковываем ее в /usr/local/etc и устанавливаем:
root@mops:/usr/local/etc# wget http_://www.digitemp.com/software/linux/digitemp-3.2.0-ds9097.tar.gz #убрать _ в адресе.
root@mops:/usr/local/etc#tar digitemp-3.2.0-ds9097.tar.gz
root@mops:/usr/local/etc#cd digitemp-3.2.0
root@mops:/usr/local/etc/digitemp-3.2.0# make ds9097
root@mops:/usr/local/etc/digitemp-3.2.0# make install
1. Инициализируем датчик:
GNU Public License v2.0
Turning off all DS2409 Couplers
.
Searching the 1-Wire LAN
28AEDB44020000DE : DS18B20 Temperature Sensor
ROM #0 : 28AEDB44020000DE
Wrote .digitemprc
root@mops:/#
2. Считываем значения температуры:
GNU Public License v2.0
Dec 10 13:43:19 Sensor 0 C: 0.69 F: 33.24
root@mops:/#
3. Считываем значение в градусах Цельсия(цифровое значение):
Установка для FreeBSD:
1. Под FreeBSD, версия пакета - digitemp-3.2.0 собираться отказалась, но без проблем собрал на последней версии digitemp-3.6.0.tar.gz.
Качаем, распаковываем, устанавливаем:
[root@srv /]#tar xvfz /digitemp-3.6.0.tar.gz -C /usr/local/etc/
[root@srv /]# cd /usr/local/etc/digitemp-3.6.0/
Если компиляция прошла удачно, запускаем:
Для удобства сделаем симлинк:
2. Теперь необходимо проинициализировать датчик, запускаем digitemp с параметрами -q -w и указываем COM-порт в который подключена схема.
В FreeBSD COM-порты - это файлы устройств /dev/cuau0, /dev/cuau1..и тд.
3. Теперь сохраняем параметры датчика в конфиг. файл, для этого выполняем:
4. После чего digitemp в своем каталоге создаcт файл .digitemprc с персональными настройками датчика, теперь для просмотра температуры выполняем:
Так как мой ПК стоит неподалеку от окна, решил датчик подцепить именно на нем. Тут у меня OC MOPSLinux (Slackware). Но в силу обстоятельств, значения температуры я перебрасывал через NFS на сервер, который расположен в серверной, где установлена более правильная ОС FreeBSD. На ней уже крутится WEB-сервер, установим RRDtool и другие вкусности.
Продолжим для FreeBSD...
Для отрисовки графиков я использовал набор утилит - RRDtool. Для работы необходим уже настроенный Web-сервер.
Установку производим из портов:
[root@router /usr/ports/databases/rrdtool12]# make install clean
Примеры использования RRDTool можно найти после установки сдесь:
total 30
-r-xr-xr-x 1 root wheel 2628 8 дек 14:16 4charts.pl
-r-xr-xr-x 1 root wheel 1193 8 дек 14:16 bigtops.pl
-r-xr-xr-x 1 root wheel 864 8 дек 14:16 cgi-demo.cgi
-r-xr-xr-x 1 root wheel 1150 8 дек 14:16 minmax.pl
-r-xr-xr-x 1 root wheel 4914 8 дек 14:16 perftest.pl
-r-xr-xr-x 1 root wheel 4398 8 дек 14:16 piped-demo.pl
-r-xr-xr-x 1 root wheel 5656 8 дек 14:16 shared-demo.pl
-r-xr-xr-x 1 root wheel 1279 8 дек 14:16 stripes.pl
[root@router /usr/local/share/examples/rrdtool]#
Считаываем значения температуры в файл:
Файл с значением температуры с датчика у меня расположен тут:
Создаем скрипт, который будет генерировать графики:
# Путь к исполнимому файлу rrdtool
RRDTOOL=/usr/local/bin/rrdtool
# Путь к базе, в которой храниться температура
DATABASE=/usr/local/rrd/space-temperature.rrd
# Периодичность поступления данных в базу (сек) - соответственно должен быть настроен CRON
PERIOD=60
# Команда для получения текущей температуры с датчика!
SENSOR=`/bin/cat /mnt/nfs_mops/weather.txt `
# Путь к папке, в которой будут лежать изображения с графиками зависимости, каталог web-сервера.
IMAGE_PATH=/usr/local/www/data/temp.luaz
# Горизонтальная надпись в заголовке графика
TITLE_TEXT='Температура'
# Горизонтальная надпись в легенде под графиком
UNDER_TEXT='Статистика температуры'
# ========= ШАГ 1. Запись в базу данных полученных значений температуры ======
# Проверяем, присутствует ли вообще база для температуры. Если нет - создаём
if ! [ -f $DATABASE ]
then
$RRDTOOL create $DATABASE -s $PERIOD 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
fi
$RRDTOOL update $DATABASE N:$SENSOR
# ============================================================================
# Функция для построения зависимости температуры от времени
function DRAW_GRAPHIC
{
# Определяем время, во сколько генерируется график
NOW_HOUR=`date +%H`
NOW_MIN=`date +%M`
NOW_SEC=`date +%S`
# На основе параметра 2, переданного функции вычисляем какой комментарий написать
case $2 in
day)
TIME_TEXT="за последние 24 часа"
;;
week)
TIME_TEXT="за последнюю неделю"
;;
month)
TIME_TEXT="за последний месяц"
;;
year)
TIME_TEXT="за последний год"
;;
esac
$RRDTOOL graph $IMAGE_PATH/$1 \
-s -1$2 \
-e now \
-a PNG \
-v 'градусы Цельсия' \
-t "$TITLE_TEXT $TIME_TEXT" \
-r \
-E \
-i \
-R light \
--zoom 1 \
-w 500 \
-h 150 \
--font DEFAULT:10:/usr/local/share/rrdtool/fonts/ARIAL8.TTF \
DEF:temperature=$DATABASE:temperature:AVERAGE \
LINE2:temperature#33cc33 \
GPRINT:temperature:LAST:'Текущая\:%2.1lf'\
GPRINT:temperature:MIN:'Мин\:%2.1lf' \
GPRINT:temperature:MAX:'Макс\:%2.1lf' \
GPRINT:temperature:AVERAGE:'Средняя\:%4.1lf'
}
# ========= ШАГ 2. Отрисовка графиков зависимости температуры от времени ========
DRAW_GRAPHIC 'temp_d.png' 'day'
DRAW_GRAPHIC 'temp_w.png' 'week'
DRAW_GRAPHIC 'temp_m.png' 'month'
DRAW_GRAPHIC 'temp_y.png' 'year'
Создадим необходимые каталоги:
[root@router ]#mkdir -p /usr/local/www/temp.local/
Для правильного отображения кириллических шрифтов, необходимо добавить в /usr/local/share/rrdtool/fonts/ - шрифт ARIAL8.TTF. Его можно скачать в прикрепленных файлах в конце статьи.
Добавляем его в крон, для автоматического обновления через каждую минуту:
*/1 * * * * root /mnt/src.sh > /dev/null 2>&1
Создаем Virtualhost в Apache и перегружаем его:
ServerAdmin vlymar@localhost
ServerName temp.luaz
DocumentRoot /usr/local/www/data/temp.luaz
DirectoryIndex index.php index.php3 index.html
AddType application/x-httpd-php .php .php3
Action application/x-httpd-php /cgi-bin/php-cgi
ErrorLog /var/log/temp.luaz-error.log
CustomLog /var/log/temp.luaz-custom.log combined
</VirtualHost>
Теперь при входе в браузер по адресу(у меня): http://temp.luaz, можно наблюдать сгенерированные с помощью rrdtool графики.
Немного приукрасим в один php файл:
<head>
<meta charset='koi8-r'>
<title> Temperature Bogdan-Motors </title>
</head>
<body bgcolor='#2E8B57'>
<br>
<center> <h2><font face='Arial'>Температура за окном завода ДП АСЗ №2 "Богдан-Моторс"</font></h2>
<?php
$text = file_get_contents( "/mnt/nfs_mops/weather.txt" );
$text1 = file_get_contents( "/mnt/date2.txt" );
?>
<center> <h1><font color="#FFFFFF" face='Arial'><?php print $text ?> C°</h1></font>
<font size="2" >Данные сняты: <?php print $text1 ?></font>
<br><br>
<center> <img src='temp_d.png'> </center><br>
<center> </h2> <img src='temp_w.png'> </center><br>
<center> <img src='temp_m.png'> </center><br>
<center> <img src='temp_y.png'> </center>
</body>
</html>
По желанию, можно подредактировать виджет SuperKaramba:
Так же можно прикрутить значения температуры к проэкту narodmon.ru:
$temp = file_get_contents( "/temp.txt" );
$fp = @fsockopen("tcp://narodmon.ru", 8283, $errno, $errstr);
if(!$fp) exit("ERROR(".$errno."): ".$errstr);
fwrite($fp, "#00-1D-60-73-F0-98\n#28AEDB44020000DE#".$temp."##");
fclose($fp);
?>
Ветка форума для обсуждения: Мониторинг температуры с помощью rrdtool.
Прикрепленный файл | Размер |
---|---|
ARIAL8.TTF | 57.05 кб |
src.sh | 2.92 кб |
digitemp-3.2.0-ds9097.tar_.gz | 157.81 кб |
digitemp-3.6.0.tar_.gz | 283.31 кб |
- Войдите на сайт для отправки комментариев
- Версия для печати
Шрифт не нужен, достаточно в заголовке заменить koi-8r на utf-8
По вашей доке снимаю данные с термодатчика, рисую графики, но если температура(ниже 0 не проверял) от 0 до 9.99, в оси Y шкала отображается с нормальными делениями, например от 4.5 - 5.0 - 5.5, может и более точная шкала, в зависимости от разброса температур.
Но если температура равно или больше 10, график рисует в шкале только целое число, и получается шкала Y например: 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11 не отображает десятых, подскажите где собака зарыта, как добавить десятичные знаки, если цело число равно или больше двух знаков?
а что означает %.2C - уж не два ли знака после точки?
#./digitemp -c /usr/local/etc/digitemp-3.6.0/.digitemprc -t 0 -s /dev/cuau0 -q -o "%.2C" > /mnt/nfs_mops/weather.txt
я через 1wirefs записывю в файл на другой машине значение типа 6.1255
и у меня в базе данных rdd значения почему-то не всегда обновляются. cron срабатывает исправно. грешу на формат данных в weather.txt
поэтому присоединяюсь к одному из предыдущих комментаторов - какой формат в weather.txt?
>а что означает %.2C - уж не два ли знака после точки?
Да, округление до сотых, 2 знака.
Пример моего
да там везде права 777, а какие должны быть владелец?Группа?
Это для FreeBSD? Порт ttyS0 так и должен быть?
digitemp -i -s /dev/ttyS0 - На эту команду говорит "нет такого файла" (правда для версии 3.5.0)
Это для Linux, /dev/ttyS0 - это COM-порт в Linux.
> Это для Linux, /dev/ttyS0 - это COM-порт в Linux.
Это понятно :)
Но в правом верхнем углу написано FreeBSD и я грешным делом подумал, что один в один пойдет для фряхи.:(
Все таки для того, чтобы не вносить смуту предлагаю в начале статьи добавить строчечку "Это для Linux".
А для фришных людей добавить, что собирать нужно gmake ds9097
Инициализировать датчики digitemp_DS9097 -i -s/dev/cuad0 (ну или какой порт пишет фришка)
Запускать digitemp_DS9097 -a (или сначала сделать линковку ln -a digitemp_DS9097 digitemp)
А в общем статья классная.
Спасибо за замечания! Подкорректировал.
А можно глянуть на файлик weather.txt Как в нем записаны показания?
# sh /80gb/scripts/src.sh
function: not found
ERROR: Opening '/80gb/www/adios.spb.ru/weather/temp.adios/' for write: Is a directory
DRAW_GRAPHIC: not found
DRAW_GRAPHIC: not found
DRAW_GRAPHIC: not found
DRAW_GRAPHIC: not found
И я так и не понял, в RRD базу кто должен создать?Я вручную или скрипт?
Дайте право на запись в /80gb/www/adios.spb.ru/weather/temp.adios/.
Скрип автоматически сгенерирует базу.
да там везде права 777, а владелец группа какие должны быть?
Дефолтных root:wheel вполне достаточно.
всё равно то же самое
Давайте на форум, Покажите там полностью свой конфиг.