Pull to refresh

Сеть умного дома 1-wire и FreeBSD

Reading time 4 min
Views 53K
Статей про «умный дом» и технологию 1-wire написано великое множество. Я же хочу написать как это делается «с нуля» и не на ОС Linux (как в большинстве инструкций и статей в сети), а на FreeBSD.

Почему именно эта ОС? Потому что есть люди, у которых дома развёрнуты собственные маршрутизаторы на FreeBSD, у которой есть некоторые отличия от Linux в настройке тех или иных служб и сервисов. Саму статью я пишу как новичек, т.е это, в своём роде, попытка поделиться собственным опытом.

Про построение сети 1-wire на FreeBSD материала написано не много, и, как правило, нигде нет исчерпывающей информации по «азам» начинающего домовода. Обычно на форумах встречают фразами «читай man», «учи матчасть», «всё элементарно» и т.п., по существу никто никакой подсказки или помощи не даёт.

Будем делать всё сами. Для начала попробуем развернуть что-то простое, например сеть с датчиком температуры. Что нам понадобится.

1. Инструменты
— Паяльник. Нужно будет припаять два проводка, поэтому особых навыков владения паяльником не нужно. Пока не нужно.
— Нож или что-то, чем можно снять изоляцию.

2. Аппаратная часть
— Наш роутер/шлюз/сервер с FreeBSD (у меня 9 RELEASE)
— Контроллер DS9490R для сети 1-wire
image
— Датчик температуры DS1820+PAR. «PAR» говорит нам о том, что датчику для работы достаточно «паразитного» тока. Нам это очень пригодится, если мы строим небольшую автономную сеть. В масштабах квартиры этого хватает. Спецификацию на датчик можно почитать ТУТ (PDF).
image
— Кабель, например витая пара категории 5. Для теста я использовал обрезок обычного телефонного кабеля, но дома всё лучше делать как следует.

3. Программное обеспечение
— owfs. Комплект утилит для работы с контроллером 1-wire сети.

Приступим.
Сначала установим вспомогательное ПО.
Устанавливаем fuse-kmod. Я всё ПО ставлю через утилиту portmaster, которая ставится из:
/usr/ports/ports-mgmt/portmaster
кому религия не позволяет, могут ставить из портов вручную.
Выполняем команду:
portmaster sysutils/fusefs-kmod
Если появится вопрос «Сделать ли автоматическую конфигурацию», то ставим галочку. В противном случае нам придётся вручную добавлять в файл /etc/rc.conf следующую строку:
fusefs_enable="YES"
и командой
/usr/local/etc/rc.d/fusefs start
запускать Fuse.

Далее ставим:
portmaster devel/swig13
и выполняем команды:
echo 'vfs.usermount=1' >> /etc/sysctl.conf
/etc/rc.d/sysctl restart


Теперь пакет owfs. Тут были некоторые сложности. С официального сайта owfs.org текущая версия (на момент написания этой статьи) 2.8p14 отказывалась ставиться. Точнее отказывалась компилироваться. Порывшись в багтраке я нашёл официальный патч, который устранил возникшую ошибку компиляции, но породил другую. На форуме сайта www.lissyara.su кто-то отписал, что у него была такая же проблема ещё в версии 8.2 и один товарищ выложил в сеть свою сборку, которая успешно ставилась на FreeBSD. Заглянув на его ftp, я нашёл сборку и для текущей версии.

Взять её можно отсюда: ftp://hi.dp.ua/unix/owfs/owfs-2.8p14.tar.gz
На всякий случай, если по какой-то причине сервер ляжет, я выложил архив в альтернативное хранилище:
http://ifolder.ru/29766619

Качаем архив и распаковываем:
fetch ftp:// hi.dp.ua/unix/owfs/owfs-2.8p14.tar.gz
tar -zxvf owfs-2.8p14.tar.gz
cd owfs-2.8p14

Командой:
chmod +x insta.sh
делаем скрипт исполняемым и запускаем:
./insta.sh
Кстати, insta.sh — это не моя опечатка, это опечатка автора сборки. Переименовывать файл и перепаковывать архив я не стал, чтобы контрольная сумма с оригинального сервера совпадала с тем, что я выложил на iFolder.

Когда скрипт отработает по адресу /usr/local появится директория «owfs» — это то, с чем мы будем работать.

Теперь с железками.

Берём наш телефонный кабель и одним концом втыкаем в контроллер, а со второго конца срезаем коннектор и снимаем с двух проводков изоляцию.
В телефонном (RJ-11) коннекторе 6 контактов, а проводки стоят в 3 и 4 контактах. У меня в 3-контакте был зелёный, а в 4-м красный проводки.
Берём нашего «треножника», только не такой:
image
а тот, который датчик температуры.
Ноги №1 и №3 объединяем вместе (спаиваем) и припаиваем к ним красный проводок, к оставшейся ноге №2 припаиваем зелёный. Я на работе, за неимением паяльника, делал всё на коленке скрутками:
image
в домашних условиях, понятное дело, всё должно паяться как следует, чтоб ничего лишнего нигде не торчало и выглядело красиво.
Втыкаем контроллер в USB-разъём нашего сервера. Создаём директорию "/mnt/1wire":
mkdir /mnt/1wire
и выполняем команду:
/usr/local/owfs/bin/owfs -C -u /mnt/1wire
Должно высветиться сообщение, содержащее что-то типа:
Opened USB DS9490 bus master at
Отлично, контроллер заработал. Теперь проверим, работает ли датчик температуры.

Проверим содержимое директории /mnt/1wire:
image
Появились файлы и директории. У меня директория, начинающаяся с «81.» — это сам контроллер, а вот начинающаяся с «10.» — это уже температурный датчик. Посмотрим что она в себе содержит:
image
Ага! Есть файл с названием «temperature». Скорей всего это то что нам надо. Выведем содержимое этого файла:
image
Ну вот, мы увидели текущую температуру. Дальше можно эти данные использовать где угодно, хоть в PERL, хоть в PHP, хоть в BASH — кому что нравится.

Ну вот, это самые основы. Осилили это — остальное само приложится, если делать по аналогии.
Теперь эти «сопли» можно разобрать, проложить по дому общую шину из нормального кабеля и навешать последовательно столько датчиков, сколько нужно. Все датчики можно будет опросить каким-нибудь самописным скриптом — всё зависит от поставленных задач.

Надеюсь этот материал поможет тем, кто только начинает осваивать 1-wire с сервером на ОС FreeBSD.
Tags:
Hubs:
+12
Comments 47
Comments Comments 47

Articles