Технология 1-wire — мониторинг температуры помещения

Есть у меня одна фирма, которая сидит в частном доме и для отопления там используется электрический котел. Руководству захотелось видеть состояние температуры контура отопления, и черт меня дернул ляпнуть, что такое решения есть и называется технологией «Умный дом». Ну раз знаешь (ага), то делай, решило начальство. Что из этого получилось, читайте ниже.

График температуры

После изучения данного вопроса, получилось, что из общедоступного существует пакет owfs и digitemp. Owfs хоть и навороченее, но как его заставить нормально работать под FreeBSD я не разобрался, поэтому выбор пал на digitemp.

Веб-сервер решил поставить на Win2K3 R2, digitemp и MySQL на FreeBSD 10, туда же к com-порту физически подключен мастер-контролллер 1-wire DS9097. Его схема приведена на рисунке, заработал сразу.

Схема DS9097

Схема DS9097

Плату травить не стали, прошкрябали дорожки так. Фото готового устройства

Плата адаптера

Плата адаптера

Как видно, к контроллеру подключены два датчика DS18B20 — один прилеплен к радиатору батареи отопления, второй «нюхает» температуру помещения (расположен с другой стороны платы). Конечно, существует погрешность, но в наших условиях она не принципиальная и общая картинка хорошо отражает динамику изменения температуры. Например, недавно кто-то открыл форточку чтобы проветрить помещение и забыл закрыть, котел стал работать на полную мощность, что хорошо было видно на графике.

На установке ПО останавливаться не буду, т.к. обо всем можно почитать в интернете, остановлюсь лишь на тех граблях, которые попались во время установки/настройки.

Apache 2.4

Windows-версия теперь недоступна с основного сайта, предлагается скачать у дистрибьютеров, ApacheHaus и Apache Lounge. Lounge почему-то работал нестабильно, периодически вис, поэтому поставил версию от Haus. Собирается бинарник через Visual Studio 2012 и имеет аббревиатуру VC11. В моем случае, пришлось качать версию VC9, т.к. только она работает в 2003м сервере.

Отключаем кеширование страниц, для чего создаем файл .htaccess такого содержания:

<filesMatch "\.(html|php)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>
</filesMatch>

И не забываем проверить, что модуль mod_headers включен в http.conf.

Кажется, нашел решение проблемы зависания Апача, когда к нему обращаешься через браузер IE 10/11. Для этого необходимо добавить в http.conf такие опции:

# Apparently this fixes an issue with Apache 2.4.6 on Windows hanging # when serving requests from Internet Explorer 10/11. # see https://stijndewitt.wordpress.com/2014/01/10/apache-hangs-ie11/ AcceptFilter http none AcceptFilter https none

PHP 5

C php5 та же песня — под VC9 доступна только версия 5.4.36, ее и поставил. По поводу php.ini. Во-первых, прописываем полные пути до папки расширений и подключаемых библиотек, иначе интерпретатор всего этого не увидит:

include_path = "c:/php/includes"
extension_dir = "c:/php/ext"

Включаем следующие расширения

extension = php_gd2.dll
extension = php_mbstring.dll
extension = php_mysql.dll

Первое необходимо для работы библиотеки jpgraph (о ней ниже), всторое — если мы работаем с многобайтной кодировкой и третье для подключения к БД MySQL.
И не забываем выбрать свою временную зону:

date.timezone = Europe/Moscow

JpGraph

JpGraph — объектно-ориентированная PHP-библиотека, позволяющая достаточно просто создавать графику профессионального качества, используя минимум кода. Установка достаточно проста — качаем архив и распаковываем его в папку php/includes/jpgraph. Для корректного отображения кодировки cp-1251 на графиках проделываем следующее:

В файле jp-config.inc.php определяем папку со шрифтами

define('TTF_DIR','c:/windows/fonts/');

В jpgraph_ttg.inc.php в функции function Convert($aTxt,$aFF) после строки:

$aTxt = convert_cyr_string($aTxt, "w", "k");

добавляем еще пару:

$isostring = convert_cyr_string($aTxt, "k", "i");
$unistring = LanguageConv::iso2uni($isostring);

Определяем переменную

$locale_char_set = "windows-1251";

И включаем следующие опции

define("LANGUAGE_CYRILLIC",true);
define("CYRILLIC_FROM_WINDOWS",true);
define('LANGUAGE_CHARSET', $locale_char_set);

Для корректного отображения названий месяцев исправления последнего в файле jpgraph.php меняем в функции Set($ALocale):

$this->iShortMonth[$aLocale][] = ucfirst($short);
$this->iMonthName [$aLocale][] = ucfirst($full);

на

$this->iShortMonth[$aLocale][] = LanguageConv::iso2uni(ucfirst($short));
$this->iMonthName [$aLocale][] = LanguageConv::iso2uni(ucfirst($full));

 MySQL

Тут ничего сложного — ставим, удаляем лишних пользователей и разрешаем работу по TCP/IP.

Ставим из портов digitemp (usr/ports/misc/digitemp) и проводим инициализацию программы:

# digitemp_DS9097 -i -s /dev/cuau0

Будет выведена информация о найденных датчиках и создан файл конфигурации .digitemprc примерно такого содержания:

TTY /dev/cuau0
READ_TIME 1000
LOG_TYPE 1
LOG_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F"
CNT_FORMAT "%b %d %H:%M:%S Sensor %s #%n %C"
HUM_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F H: %h%%"
SENSORS 2
ROM 0 0x10 0x1E 0xDC 0x80 0x02 0x08 0x00 0x2C
ROM 1 0x10 0x8D 0xEE 0x80 0x02 0x08 0x00 0xC3

Видно, что определились два датчика. Теперь пишем простой скрипт на bash и ставим его в cron на выполнение раз в 5 минут:

#!/bin/sh

MYSQL="/usr/local/bin/mysql"
DIGITEMP="/usr/local/bin/digitemp_DS9097"
DB="temp_db"
USER="user"
PASS="pass"
SENS0="`$DIGITEMP -t 0 -q -o "%.2C" -c /usr/local/etc/.digitemprc`"
SENS1="`$DIGITEMP -t 1 -q -o "%.2C" -c /usr/local/etc/.digitemprc`"

$MYSQL -u $USER -p$PASS --database=$DB -e "INSERT INTO temp VALUES (NOW(), \
$SENS0, $SENS1)"

Подключаемся к mysql и создаем базу такой структуры:

CREATE TABLE temp(date datetime, sensor0 decimal(4,2), sensor1 decimal(4,2);

Все, данные стали поступать в созданную БД. Теперь начинаем вспоминать html и php, пытаясь при этом подключить JQuery и понять как оно работает.

Общий вид страницы

Общий вид страницы

В итоге получаем страничку с удобной визуализацией данных. Тексты приводить не буду, вложу их в архив, который можно будет скачать по этой ссылке. Кто захочет вникнуть чуть больше, вот список литературы, особенно вторая ссылка:

1. Мониторинг температуры MRTG+Digitemp

2. Разработка домашнего сайта

3. JpGraph. Рисуем графики температуры

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *