Есть у меня одна фирма, которая сидит в частном доме и для отопления там используется электрический котел. Руководству захотелось видеть состояние температуры контура отопления, и черт меня дернул ляпнуть, что такое решения есть и называется технологией «Умный дом». Ну раз знаешь (ага), то делай, решило начальство. Что из этого получилось, читайте ниже.
После изучения данного вопроса, получилось, что из общедоступного существует пакет owfs и digitemp. Owfs хоть и навороченее, но как его заставить нормально работать под FreeBSD я не разобрался, поэтому выбор пал на digitemp.
Веб-сервер решил поставить на Win2K3 R2, digitemp и MySQL на FreeBSD 10, туда же к com-порту физически подключен мастер-контролллер 1-wire 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:/wind ows/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($is ostring);
Определяем переменную
$locale_char_set = "windows-1251";
И включаем следующие опции
define("LANGUAGE_CYRILLIC ",true);
define("CYRILLIC_FROM_WIN DOWS",true);
define('LANGUAGE_CHARSET' , $locale_char_set);
Для корректного отображения названий месяцев исправления последнего в файле jpgraph.php меняем в функции Set($ALocale):
$this->iShortMonth[$aL ocale][] = ucfirst($short);
$this->iMonthName [$aLocale][] = ucfirst($full);
на
$this->iShortMonth[$aL ocale][] = LanguageConv::iso2uni(ucf irst($short));
$this->iMonthName [$aLocale][] = LanguageConv::iso2uni(ucf irst($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/mys ql"
DIGITEMP="/usr/local/bin/ digitemp_DS9097"
DB="temp_db"
USER="user"
PASS="pass"
SENS0="`$DIGITEMP -t 0 -q -o "%.2C" -c /usr/local/etc/.digitempr c`"
SENS1="`$DIGITEMP -t 1 -q -o "%.2C" -c /usr/local/etc/.digitempr c`"
$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. Рисуем графики температуры