1-wire и websocket — магия умного дома

1 Июн

Сегодня на простом примере покажу, как можно собрать красивый мониторинг температуры для вашего будущего умного дома. Будет много магии и умных слов, но результат стоит того. Для нетерпеливых — в конце статьи есть видео работы этого примера.

Задача

Сделать красивый мониторинг температуры, а заодно погонять HTML5 и проверить его в деле.

Железо

Аппаратная платформа — пара 1-wire датчиков DS18B, которые просто разведем на макетной плате и подсоединим к компьютеру с помощью 1-wire usb хоста DS9490. Цена компонентов около 1200 рублей, не считая стоимости макетки.

Софт

В качестве платформы будем использовать последний стабильный билд убунты (12.04LTS). Для работы с 1-wire устройствами поставим замечательную библиотеку owfs (ставиться из репозитория убунты sudo apt-get install owfs). После установки создаем папку и монтируем туда наши 1-wire устройства


sudo mkdir /media/1-wire
sudo owfs --allow_other --timeout_volatile=1 -u /media/1-wire

Флаг timeout_volatile нужен для задания частоты опроса 1-wire устройств. По умолчанию он составляет 15 секунд, что для нас слишком много. Я поставил 1 секунду, этого вполне достаточно.

Сервер


Возьмем стандартный LAMP (apache+mysql+php), который идет в убунте из коробки (для серверной конфигурации) и разбавляем его с помощью nodeJs и nmp. NodeJs — это замечательный Java сервер, а nmp — это простой софт для инсталляции расширений под него.

Скрипт

Что бы не изобретать велосипед, возьмем готовый компонент спидометра, который когда-то давно был найден на хабре. Этот компонент использует канвас HTML5 и навешивает на него красивости в виде спидометра с плюшками.

Для реализации передачи данных в реальном времени будем использовать websocket html5, которые поддерживаются всеми современными браузерами. Для кроссбраузерности воспользуемся библиотекой socket.io для nodeJs.

В остальном все тривиально и понятно из комментариев к коду (исподники есть в конце статьи).

Серверная часть скрипта написана на nodeJs. C периодичностью в 500мс он опрашивает наши датчики и рассылает широковещательные сообщения все подсоединенным клиентам. Реализация понятна из комментариев:

//Подключаем модуль и ставим на прослушивание 8080-порта
var io = require('socket.io').listen(8080);

//Отключаем вывод полного лога
io.set('log level', 1);

//Раз в 500 мс обновляем показания спидометров
setInterval(function() {
//Отправим температуру с датчика 1
var fs = require('fs');
fs.readFile('/media/1-wire/28.3BDFF7020000/fasttemp', 'ascii', function(err,data){
if(err) {
console.error("Could not open file: %s", err);
//process.exit(1);
}
//Use toString on the buffer
io.sockets.emit('message', {'event': 'temprature', 'device': 't1', 'value': data.toString('ascii')});
console.log(data.toString('ascii'));
});

//Отправим температуру с датчика 2
fs.readFile('/media/1-wire/28.280BF8020000/fasttemp', 'ascii', function(err,data){
if(err) {
console.error("Could not open file: %s", err);
//process.exit(1);
}
//Use toString on the buffer
io.sockets.emit('message', {'event': 'temprature', 'device': 't2', 'value': data.toString('ascii')});
console.log(data.toString('ascii'));
});
}, 500);

Для запуска всего этого хозяйства копируем код на сервер в /var/www/temp/ и запускаем node js

nmp install socket.io
node node_tempr.js

Первая строка нужна, что бы добавить нестандартную библиотеку в папку с вашими скриптами. Вторая строка запускает наш java сервер.

Видео того как все это работает

Замечания по работе

  • Частота обновления датчика температуры в owfs 1 секунда, меньше сделать не смог, но для наших нужд этого достаточно.
  • Socket.IO нормально работает на хроме, опере, фаере и браузере андройда. Даже IE8 нормально отработал и Canvas и websocket.
  • Компонент для спидометра немного глючный. Так при числе зон подсветки больше трех, он почему-то съезжает набок, поворачиваясь на 90 градусов =)

Где применять?

Такая технология позволяет делать кроссплатформенные решения для мониторинга и управления любыми исполнительными механизмами. Кроссплатформенность позволяет получать данные на любом устройстве, подключенном к локальной сети или интернет. Главное — это наличие современного браузера и достаточное разрешение. Данные можно снимать не только с “железа”, но и из базы данных или любого другого источника.

Исходники

Исходники доступны по MIT лицензии, можете делать с ними все что угодно. Скачать можно тут.

P.S. Есть идеи по применению этой технологии? Напиши мне на kirill@molochkov.pro, реализуем.

No comments yet

Leave a Reply