Loading

Мониторинг температуры с помощью rrdtool

08.12.2010 - 15:40

Возникла идея прикрутить датчик температуры, что бы мониторить текущую температуру за окном, а так же строить графики зависимости температуры от времени.
Первым делом займемся созданием датчика температуры, который будет висеть на COM-порту. Схема довольно простая, взята тут:

circuit_nonparasitic.png

Список необходимых радиодеталей:
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.

sensor_pinout.png

GND - земля
DQ - данные
VDD - "+" питания

2. Диод и стабилитрон:
Черная полоса на конце того и другого, означает "минус" - катод.

diod2.jpg

3. Конденсатор:
Он имеет белую полоску с знаком " - ", необходимо соблюдать полярность!
При пайке, все элементы разместил в корпусе COM-разъема, наружу вынес только датчик температуры. Данная схема не требует никаких настроек.
В результате вот, что должно получится:

moto_0293.jpg

moto_0294.jpg

moto_0295.jpg

На этим хардварная часть завершена, переходим к софту.
Установка для Linux:
Снимать показания температуры будем с помощью программы digitemp-3.2.0, так как последняя версия отказалась работать.
Распаковываем ее в /usr/local/etc и устанавливаем:

root@mops:/# cd /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. Инициализируем датчик:

root@mops:/# digitemp -i -s /dev/ttyS0
DigiTemp v3.2.0 Copyright 1996-2003 by Brian C. Lane
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. Считываем значения температуры:

root@mops:/# digitemp -a -s /dev/ttyS0
DigiTemp v3.2.0 Copyright 1996-2003 by Brian C. Lane
GNU Public License v2.0
Dec 10 13:43:19 Sensor 0 C: 0.69 F: 33.24
root@mops:/#

3. Считываем значение в градусах Цельсия(цифровое значение):

root@mops:/# digitemp -c /digitemp.conf -t 0 -s /dev/ttyS0 -q -o "%.2C"
0.62

Установка для FreeBSD:
1. Под FreeBSD, версия пакета - digitemp-3.2.0 собираться отказалась, но без проблем собрал на последней версии digitemp-3.6.0.tar.gz.
Качаем, распаковываем, устанавливаем:

[root@srv /]# fetch http://www.digitemp.com/software/linux/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/
Компилируем исходник:
[root@srv /usr/local/etc/digitemp-3.6.0]# gmake ds9097

Если компиляция прошла удачно, запускаем:
[root@srv /usr/local/etc/digitemp-3.6.0]#./digitemp_DS9097

Для удобства сделаем симлинк:
[root@srv /usr/local/etc/digitemp-3.6.0]# ln -s digitemp_DS9097  /usr/local/bin/digitemp

2. Теперь необходимо проинициализировать датчик, запускаем digitemp с параметрами -q -w и указываем COM-порт в который подключена схема.
В FreeBSD COM-порты - это файлы устройств /dev/cuau0, /dev/cuau1..и тд.
[root@srv /usr/local/etc/digitemp-3.6.0]#./digitemp -q -w -s /dev/cuau0

3. Теперь сохраняем параметры датчика в конфиг. файл, для этого выполняем:
[root@srv /usr/local/etc/digitemp-3.6.0]#./digitemp -q -i -s /dev/cuau0

4. После чего digitemp в своем каталоге создаcт файл .digitemprc с персональными настройками датчика, теперь для просмотра температуры выполняем:

[root@srv /usr/local/etc/digitemp-3.6.0]#./digitemp -a -q -c /usr/local/etc/digitemp-3.6.0/.digitemprc

Так как мой ПК стоит неподалеку от окна, решил датчик подцепить именно на нем. Тут у меня OC MOPSLinux (Slackware). Но в силу обстоятельств, значения температуры я перебрасывал через NFS на сервер, который расположен в серверной, где установлена более правильная ОС FreeBSD. На ней уже крутится WEB-сервер, установим RRDtool и другие вкусности.

Продолжим для FreeBSD...
Для отрисовки графиков я использовал набор утилит - RRDtool. Для работы необходим уже настроенный Web-сервер.
Установку производим из портов:

[root@router /]# cd /usr/ports/databases/rrdtool12
[root@router /usr/ports/databases/rrdtool12]# make install clean

Примеры использования RRDTool можно найти после установки сдесь:

[root@router /]# cd /usr/local/share/examples/rrdtool
[root@router /usr/local/share/examples/rrdtool]# ls -l
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]#

Считаываем значения температуры в файл:

#./digitemp -c /usr/local/etc/digitemp-3.6.0/.digitemprc -t 0 -s /dev/cuau0 -q -o "%.2C" > /mnt/nfs_mops/weather.txt

Файл с значением температуры с датчика у меня расположен тут:

[root@router /#cat /mnt/nfs_mops/weather.txt

Создаем скрипт, который будет генерировать графики:

[root@router /]#cat > /mnt/src.sh
#!/usr/local/bin/bash
# Путь к исполнимому файлу 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/rrd
[root@router ]#mkdir -p /usr/local/www/temp.local/

Для правильного отображения кириллических шрифтов, необходимо добавить в /usr/local/share/rrdtool/fonts/ - шрифт ARIAL8.TTF. Его можно скачать в прикрепленных файлах в конце статьи.
Добавляем его в крон, для автоматического обновления через каждую минуту:

[root@router ]#cat >> /etc/crontab
*/1 * * * * root /mnt/src.sh  > /dev/null 2>&1

Создаем Virtualhost в Apache и перегружаем его:
<VirtualHost *>
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 файл:
<html>
<head>
<meta charset='koi8-r'>
<title> Temperature Bogdan-Motors </title>
</head>
<body bgcolor='#2E8B57'>
<br>
<center> <h2><font face='Arial'>Температура за окном завода ДП АСЗ &#8470;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&#176;</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>

82_0.png

По желанию, можно подредактировать виджет SuperKaramba:
84.png

Так же можно прикрутить значения температуры к проэкту narodmon.ru:

<?php
$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.TTF57.05 кб
src.sh2.92 кб
digitemp-3.2.0-ds9097.tar_.gz157.81 кб
digitemp-3.6.0.tar_.gz283.31 кб
Ваша оценка: Нет Средняя: 5 (6 votes)

Комментарии:


Гость аватар

Шрифт не нужен, достаточно в заголовке заменить koi-8r на utf-8



Pasha219 аватар

По вашей доке снимаю данные с термодатчика, рисую графики, но если температура(ниже 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?



vlymar аватар

>а что означает %.2C - уж не два ли знака после точки?
Да, округление до сотых, 2 знака.
Пример моего

#cat weather.txt:
7.15



gyurza2000 аватар

да там везде права 777, а какие должны быть владелец?Группа?



Гость аватар

Это для FreeBSD? Порт ttyS0 так и должен быть?
digitemp -i -s /dev/ttyS0 - На эту команду говорит "нет такого файла" (правда для версии 3.5.0)



admin аватар

Это для 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)

А в общем статья классная.



admin аватар

Спасибо за замечания! Подкорректировал. Winking



ur3ckr аватар

А можно глянуть на файлик weather.txt Как в нем записаны показания?