Показаны сообщения с ярлыком умный дом. Показать все сообщения
Показаны сообщения с ярлыком умный дом. Показать все сообщения

14 мая 2014 г.

Видеонаблюдение

Продолжим. Ну какой умный дом без видео наблюдения?

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

Тем не менее, я выбрал аналоговый вариант с регистратором. Что такое регистратор - по-простому это коробочка для подключения аналоговых камер и микрофонов, с линуксом внутри, что обычно подразумевает возможность подключить sata диск и записывать на него, а также подразумевает наличие ethernet порта, с различными сетевыми возможностями - записью на ftp, samba сервер или даже облако (китайское), возможность просмотра камер с доступом через определенный порт (rtsp) и т.д. Возможностей обычно много - например тот же ntp клиент, dynDns и прочее.



У меня выбор пал на следующий регистратор. Сложно понять, что это за фирма и модель, тем не менее присутствие 960H подкупило. Хотя вот кстати его шильдик:



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

Дальнейшее разбирательство привело к следующим данным. Регистратор на основе hi3520d с такой начинкой:

[root@registrator custom]$ cat ProductDefinition
{
   "Vendor" : "General",
   "Hardware" : "MBD6704T-E",
   "PackSize" : 17408,
   "PreRecSize" : 2048,
   "LogoArea" : {"Begin": "0xe80000", "End": "0xec0000"}
}

[root@registrator custom]$ cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 1 (v7l)
BogoMIPS        : 1318.91
Features        : swp half thumb fastmult edsp
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x4
CPU part        : 0xc09
CPU revision    : 1

Hardware        : hi3520d
Revision        : 0000
Serial          : 0000000000000000


Пароль для доступа через telnet к устройствам с таким контроллером xc3511. В принципе, там делать особо нечего, если не требуется каких-то сугубо специфических действий. Конфигурирование через telnet уж тем более на ваш страх и риск - не стоит там что либо править, если вы не уверены в своих действиях.

Это место в посты было переписано три раза :) Один раз кусок стер блогспот, второй раз я стер сам часто про то как я делал из rtsp jpeg. Провозившись три недели я все таки пришел к общему знаменателю вывода rtsp в веб для показа видео. И это связка - ffmpeg, nginx и nginx-rtmp. Для html5 в данный момент надо поддерживать целый зоопарк различно закодированных потоков. Это накладно для простых файлов, а для живого вещания вообще кошмар.

Как установить рассказывать не буду - вот хотя бы пример. Могу добавить, что для использования модуля надо пересобирать весь nginx целиком. Плюс добавлю, что после компиляции я создаю пакет и ставлю его:
/usr/src/nginx/nginx-1.5.9# checkinstall -D --install=no
/usr/src/nginx/nginx-1.5.9# dpkg -i nginx_1.5.9-1_amd64.deb


Дальше идем на https://github.com/arut/nginx-rtmp-module/ и читаем документацию. Пишем конфигурацию примерно такого содержания:

rtmp {

    max_connections 50;

    server {
 notify_method get;
        listen 1935;
        application cams {
            live on;
            allow publish 127.0.0.1;
            allow publish 192.168.0.0/24;
     deny publish all;
     exec_static ffmpeg -i "rtsp://ipregistrator:554/user=myuser&password=mypasswd&channel=1&stream=1.sdp" -c:v copy -profile:v baseline -c:a copy -f flv rtmp://localhost/cams/stream;
     exec_static ffmpeg -i "rtsp://ipregistrator:554/user=myuser&password=mypasswd&channel=2&stream=1.sdp" -c:v copy -profile:v baseline -c:a copy -f flv rtmp://localhost/cams/stream2;
 }

    }
}


Замечу, что exec_static выполняется при запуске nginx (ffmpeg забирает rtsp поток с регистратора и конвертирует в flv без перекодирования) , что очень удобно, не надо писать никаких дополнительных скриптов для запуска клиента.

Далее настраиваем flash плеер (uppod, flowplayer или др.) на html странице с адресом вида rtmp://server/cams/stream . В openhab с добавил Webview sitemap и в итоге у нас вышло нечто вроде:



Повесил китайский планшет на стену - openhab теперь используется в виде видеоглазка. Регистратор записывает видео при обнаружении движения (настройка довольно таки не тривиальная, но можно поиcкать инструкцию к программе cms на русском, такая существует.

В будущем планирую видео записывать в облако mail.ru, благо там получен 1 террабайт.

5 февраля 2014 г.

Управление и оповещение через jabber в openHAB

Отлично, у нас есть показания открытой двери и замка. Теперь было бы неплохо, получать какие-нибудь оповещения о событиях. Например, для начала, о том что замок закрылся или открылся.

Я решил оповещения сделать на основе jabber, тем более, что данный вариант позволяет даже управлять openHABом из jabber. Создаем учетную запись (xmpp или jabber). Ищем секцию xmpp в openhab.cfg. Прописываем сервер, логин, пароль.
Отправляем команду help:

(15:22:48) I: help
(15:22:49) my****@jabber.org: Usage: 
update ⟨item⟩ ⟨state⟩ - sends a status update for an item
send ⟨item⟩ ⟨command⟩ - sends a command for an item
status ⟨item⟩ - shows the current status of an item
items [⟨pattern⟩] - lists names and types of all items matching the pattern
say ⟨sentence to say⟩ - Says a message through TTS on the host machine
⟩ ⟨script to execute⟩ - Executes a script


Теперь разберемся, как нам послать сообщение о смене статуса открытого замка. Для этого просто создадим новое правило в home.rules:

rule "Door Check Lock Send"
when
        Item Main_Door_Lock changed
then
        if(Main_Door_Lock.state==1)
        {
            sendXMPP("jabber@jabber.org", "Замок двери открыт!")
        }
        else if(Main_Door_Lock.state==0)
        {
            sendXMPP("jabber@jabber.org", "Замок двери закрыт!")
        }
        else{
            sendXMPP("jabber@jabber.org", "Неполадки с датчиком замка двери!")
        }
end


Очень помогает в написании правил функция авто-дополнения в дизайнере (Ctrl+Space), ибо документация по этому поводу хромает.

Поэкспериментировав понимаем, что время отклика оставляет желать лучшего. Смотрим лог owfs - датчик опрашивается openHAB'ом раз в минуту - это как раз настройка в openHAB. К сожалению на данный момент время обновления едино для всех датчиков 1-wire в openHAB. Поэтому ничего не остается, как сменить частоту обновления хотя бы на раз в 10 секунд.

Кеш owfs для датчиков по умолчанию 15 секунд. Поэтому, чтобы получать свежие значения, надо изменить его на 10 секунд. Пропишем в owfs.conf:
timeout_volatile = 10
#error_print = 1
error_print = 3
error_level = 2

error_print = 3 обозначает подавление логов - при опросе раз в 10 секунд из слишком много.

Протестировав я понял, что и 10 секунд слишком много. Но дальше увеличивать частоту опросов всех датчиков накладно. И вообще неплохо бы использовать unchached значения из owfs для датчиков, а кеш использовать только для датчиков, данные которых не критичны в времени опроса - например, датчики температуры. Но в openHAB пока с этим проблемы. Поэтому будем использовать небольшой хак. Для датчиков мы будем использовать exec binding и получать данные с файловой системы. Формат запроса:

in:  exec:"<[<commandline execute="" to="">:<refreshintervalinmilliseconds>:<transformationrule>]"

items:

Number Main_Door_Lock "Замок в двери C: [MAP(ru.map):%s]"<door>(Doors) { exec="<[/bin/cat /mnt/1wire/uncached/12.A214B2000000/sensed.A:5000:REGEX((.*?))]" }

В принципе, тут можно использовать и Contact.
Результат срабатывания правила:





Последний штрих - теперь нам надо настроить запуск приложения файловой системы owfs, потому что мы с него получаем данные. (Проверьте, что у вас запускается при старте в директориях rc.d).
# update-rc.d owfs defaults 30

Не забудьте выставить очередь запуска после owserver (у меня, как видно 30, а у owserver 20)!

2 февраля 2014 г.

Owfs - установка из исходников

Начнем с лирического отступления. Проанализировав показания термометра DS18B20 я понял, что он немного завышает показания.   Погуглив я нашел две причины: либо самонагрев датчика от частого опроса, либо неоткаллиброванный датчик. Решил получше изучить логи owfs.

1. Включаем логи: /etc/owfs.conf

error_print = 1 
error_level = 3 

Перезапускаем owserver и смотрим что у нас в логах. (Обратите внимание, что я рассказываю про версию из deb пакета в init.d скрипте которого уже указан путь к конфигу). А в логах у нас пусто. Помните, как мы устанавливали систему? Позже мы поставили rsyslod.

Ищем # whereis owserver , чтобы запустить его не в режиме сервиса , а в консоли.

#/usr/bin/owserver --debug  --error_level=9 --error_print=2 --foreground -c /etc/owfs.conf --pid-file /var/run/owfs/owserver.pid
DEBUG MODE
libow version:
        2.8p15


И снова пусто. Но не только у нас. Похоже, что в deb пакете owfs логирование выключено.

Посему удаляем owfs (сохраним init.d скрипты и owfs.conf - хотя они удалиться не должны). Качаем версию посвежее. Распаковываем tar -xvzf... Устанавливаем необходимое для компиляции и сборки.

#apt-get install autoconf libtool libusb-dev libfuse-dev make ed
#cd /usr/src/owfs-2.9p1
#./configure --help
#/owfs-2.9p1# autoreconf -i

Я сконфигурировал следующим образом (также можно добавить опцию --enable-owtraffic Enable bus traffic reports (default false) - очень интересная опция, дающая возможность отслеживать трафик в самой 1-wire сети):

#./configure --enable-debian --disable-owftpd --disable-owperl --disable-owphp --disable-parport --disable-owpython
# make -j4
# make install

По умолчанию все устанавливается в директорию /opt/owfs/ . Сделаем линк в /usr/bin , что бы было проще использовать и не переписывать скрипты запуска.

# for p in owfs owserver owhttpd owftpd owread owwrite owdir ; do ln -sf /opt/owfs/bin/$p /usr/bin/$p ; done

Пробуем запускать:

/usr/bin/owserver --debug  --error_level 9 --error_print 2 --foreground -c /etc/owfs.conf --pid-file /var/run/owfs/owserver.pid

Если все хорошо, перезапускаем сервер с помощью init скрипта и смотрим syslog. Отлично! Теперь укажем всем клиентским приложениям использовать tcp сервер (owserver) для работы, ибо usb устройство уже занято им (то есть все приложения пакета owfs должны работать через owserver - если он запущен, либо по одиночке). Пропишем в конфиг (он должен автоматически подхватываться (ключ -c) всеми init.d скриптами пакета owfs, которые у нас остались после установки deb пакета из репозитория):

# With this setup, any client (but owserver) uses owserver on the
# local machine...
! server: server = localhost:4304

В конфиге программы с репозитория эта строчка уже указана.

Но скрипта для приложения (не пакет) owfs в init.d нет (вообще странный пакет в репозитории дебиана - логов нет, управление не понятно, такое ощущение, что делал человек, плохо знакомый с owfs). Можем сделать на основе скрипта owhttpd и запускаем:

# /etc/init.d/owfs start
[ ok ] Starting 1-Wire owfs Daemon: owfs.
root@debtruck:/etc/init.d# ps -A | grep ow
 2478 ?        00:00:01 owserver
 3262 ?        00:00:00 owfs

Смотрим работающие логи.

20 января 2014 г.

Получение данных через интернет или сеть в OpenHAB. Использование Oracle Java 1.7

Температура дома у нас есть. Пока у меня нет внешней температуры, ее можно получить в интернете. Сделать это очень просто используя http binding. В демо есть пример.

Итак, для начала попробуем использовать пример с демо. Ищем свой yahoo woeid.

Пишем в sitemap :

Frame label="Погода" {
  Text item=Yahoo_Temperature {
   Frame {
    Text item=Yahoo_Temp_Max
    Text item=Yahoo_Temp_Min
   }
   Frame {
    Chart item=Yahoo_Chart period=h refresh=10000
   }
  }
 }


Пишем в items :

Group Yahoo_Chart   (Weather)
Number Yahoo_Temperature   "Температура на улице yahoo [%.1f °C]" <temperature> (Yahoo_Chart) { http="<[http://weather.yahooapis.com/forecastrss?w=_тут ваш woeid_&u=c:60000:XSLT(yahoo_weather_temperature.xsl)]" }
Number Yahoo_Temp_Max   "Сегодня максимум [%.1f °C]" <temperature> (Yahoo_Chart)
Number Yahoo_Temp_Min   "Сегодня минимум [%.1f °C]" <temperature> (Yahoo_Chart)


Загляните в yahoo_weather_temperature.xsl - это шаблон для извлечения данных из возращенного xml.

Сейчас мы видим, что item Yahoo_Temp_Max и Yahoo_Temp_Min не привязаны к источнику данных. Откуда же их брать? Смотрим demo.rules, а также документацию здесь и прописываем себе тоже в файл home.rules:

             
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

rule "Update max and min temperatures"
when
    Item Yahoo_Temperature changed or
    Time cron "0 0 0 * * ?" or
    System started
then
    postUpdate(Yahoo_Temp_Max, Yahoo_Temperature.maximumSince(now.toDateMidnight).state)
    postUpdate(Yahoo_Temp_Min, Yahoo_Temperature.minimumSince(now.toDateMidnight).state)
end


Ну и последнее, сохранение. Добавим в rrd4j.persist:
Weather*, PersistTemp* : strategy = everyMinute, restoreOnStartup
Перезапускаем сервер и я получил ошибку в логах:
 Executing startup rule 'Startup'
22:32:27.859 ERROR o.e.x.x.s.XbaseScopeProvider[:189]- error during scoping
com.google.inject.ProvisionException: Guice provision errors:

1) Error injecting constructor, java.lang.NullPointerException: null key


Ошибка решается установкой Oracle Java.

Удаляем OpenJDK, устанавливаем Oracle Java (инсталлер качает oracel java с интеренета).

# /etc/init.d/openhab stop
# apt-get remove icedtea-6-jre-jamvm
# apt-get autoremove
# echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
# echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
# apt-get update
# apt-get install oracle-java7-installer
# java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode)


Вчера настроил yahoo, а сегодня сервер мне уже показывает вместо -20C реальных: -2C. Поэтому я решил не использовать погоду от yahoo. Решил добавить gismeteo, openweathermap.org и worldweatheronline.net и вычислить среднее арифметическое с показаний. Забирать температуру буду раз в полчаса, чтобы не нагружать сервер.

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

  1. Запрашиваем данные раз в полчаса с трех источников (чаще нет смысла - их обычно обновляют раз в три часа). (items)
  2. Сохраняем данные раз в полчаса с каждого ресурса. (persist)
  3. Вычисляем среднюю температуру после обновления хотя бы одного источника (rules)
  4. Вычисляем максимальную и минимальную температуру после обновления средней температуры (rules)
  5. Сохраняем среднюю, максимальную и минимальную температуру при их обновлении (everyChange в persist)
  6. Выводим среднюю температуру, а также график средней, минимальной и максимальной (аналогично как в демо)

Update. Тут обнаружилась проблема (версия openHAB 1.4 - графики не выводятся, если данные сохранены реже, чем раз в минуту. Поэтому сохраняем раз в минуту пока. В общем, это не проблема, а фича. rrd имеет шаг (step) и сердцебиение (heartbeat). Шаг - время обновления базы rrd, сердцебиение - время в течении которого данные сохраняются. То есть, если мы не попадаем в heartbeat (сохраняем реже) - данные не сохраняются! heartbeat в openhab забит жестко (по крайней мере, пока) - и составляет 60 секунд. Поэтому лучше всего сохранять не реже 1 минуты. Шаг, насколько я понял, это параметр во время которого rrd принимает решение о хранении данных. В openhab оно настроено так:

 rrdDef.addArchive(function, 0.5, 4, 360); // one day (granularity 4 min)
                rrdDef.addArchive(function, 0.5, 15, 644); // one week (granularity 15 min)
                rrdDef.addArchive(function, 0.5, 60, 720); // one month (granularity 1 hour)
                rrdDef.addArchive(function, 0.5, 720, 730); // one year (granularity 12 hours)
                rrdDef.addArchive(function, 0.5, 10080, 520); // ten years (granularity 7 days)


То есть, после первого дня хранения, точность данных меняется на 4 минуты, после одной недели на 15 минут, одного месяца на на 1 час и так далее...

В принципе, все шаги очевидны, единственно, я немного затормозил на этапе вычисления средней температуры. Значения надо предварительно перевести в DecimalType:
rule "Update average temp"
when
    Item Owm_Temperature changed or
    Item Gismeteo_Temperature changed or
    Item Wwo_Temperature changed or
    System started
then
    var Number owm = Owm_Temperature.state as DecimalType
    var Number gismeteo = Gismeteo_Temperature.state as DecimalType
    var Number wwo = Wwo_Temperature.state as DecimalType
    postUpdate( Average_Temperature, ( owm + gismeteo + wwo ) / 3  )
end






ps. Заодно поменяем ntp сервер для даты в файле конфигурации. Я люблю pool.ntp.org.

14 января 2014 г.

Знакомство с OpenHAB

В прошлой заметке я решил сменить платформу для управления умным домом.

Архитектура OpenHAB:



OpenHAB состоит из двух частей райнтайма (аналог контроллера в openremote, ну или просто сервер) и дизайнера. В принципе, дизайнером некоторые не пользуются - правят конфигурацию вручную.

Удаляем скрипт OpenRemote из автозагрузки.

# update-rc.d openremote remove

Java у нас уже стоит.

Runtime

Качаем runtime (проверьте версию, у меня на данный момент 1.3.1).

# wget http://openhab.googlecode.com/files/openhab-runtime-1.3.1.zip
# wget https://openhab.googlecode.com/files/openhab-addons-1.3.1.zip
# unzip openhab-runtime-1.3.1.zip -d /srv/openHAB
# unzip openhab-addons-1.3.1.zip -d oh-addons

Копируем необходимые addons в одноименную /srv/openHAB/addons. Я скопировал пока такие:

# ls -l
-rw-rw-r-- 1 root root   38725 Sep 19 00:25 org.openhab.action.mail-1.3.1.jar
-rw-rw-r-- 1 root root 1246014 Sep 19 00:26 org.openhab.action.xmpp-1.3.1.jar
-rw-rw-r-- 1 root root   31270 Sep 19 00:29 org.openhab.binding.http-1.3.1.jar
-rw-rw-r-- 1 root root   23164 Sep 19 00:31 org.openhab.binding.ntp-1.3.1.jar
-rw-rw-r-- 1 root root   29468 Sep 19 00:36 org.openhab.binding.onewire-1.3.1.jar
-rw-rw-r-- 1 root root   18734 Sep 19 00:46 org.openhab.persistence.exec-1.3.1.jar
-rw-rw-r-- 1 root root   19373 Sep 19 00:46 org.openhab.persistence.logging-1.3.1.jar
-rw-rw-r-- 1 root root  630764 Sep 19 00:46 org.openhab.persistence.rrd4j-1.3.1.jar
-rw-rw-r-- 1 root root     126 Aug 31 03:03 README

Обратите внимание, org.openhab.binding.owserver-1.3.1.jar используется для железки под названием EDS OWServer . Нам же нужен org.openhab.binding.onewire-1.3.1.jar .
Не забудьте, у нас уже установлен owfs с его owserver.

Копируем файл configurations/openhab_default.cfg в configurations/openhab.cfg и правим.

Из чего состоит openHAB Runtime?

1. Асинхронная шина событий.

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

  • Команды, которые вызывают действие или изменение состояния некоторого элемента/устройства.
  • Обновления статусов, которые информируют об изменении статуса некоторых элементов/устройств (часто в ответ на команду).

2. Что такое элементы шины? Это items. Кто может запускать события?  Это sitemap и rules.

Items - это представление наших устройств, их значения можно менять с помощью правил или через Sitemap. Sitemap - графическое представление и структура. Rules, соответственно правила.

Вот еще одна красивая картинка шины событий openHAB:



Дизайнер

Так как у нас сервер без иксов и графики, то дизайнер мы будем использовать на машине с windows.
Качаем дизайнер, запускаем и получаю ошибку Failed to load the JNI shared library "c:\soft\jdk1.7\\bin\..\jre\bin\server\jvm.dll". Это потому, что Дизайнер (основанный на eclipse) работает в 32 битной среде. Качаем 32 (x86) битную яву и ставим.

Меняем конфиг (openHAB-Designer.ini) дизайнера.

-vm C:/soft/jdk1.7_32/bin/javaw.exe

И запускаем. Также скачаем папку configuration с сервера (напомню, я использую winscp). Укажем ее, как папку конфигурации (например c:\temp\openhab-demo-configuration-1.3.1\configurations\). Теперь скачем демо конфигурацию с сайта на рабочую машину, чтобы было на что ориентироваться.





Поковырявшись немного в дизайнере, кроме всплывающих подсказок (Ctrl+Space), ничего не нашел. Поэтому для начала им воспользуемся, а потом в принципе нужно будет прикрутить подсветку синтаксиса для mc.

Начнем. Создаем файл sitemap, например home.sitemap . Честно говоря, в дизайнере даже этого нет. :) Но создать можно нажав ctrl+N (там проблема с директориями - они не отображаются - но разобраться можно). Пишем в файле "sitem" и нажимаем Ctrl+Space. Выбираем шаблон sitemap. И у нас появляется нечто вроде этого:

sitemap name label="label" {
 
}


Читаем документацию по sitemap, чтобы понять, что же нам делать дальше. Удобно сравнивать, что у нас в demo.sitemap и в онлайн демо. Быстро понимаешь, что к чему.
Разобьем по комнатам (у меня, к сожалению, этажей нет).

sitemap name label="Дом" {
 Frame {
  Group item=Hall label="Зал" icon="office"
  }
 Frame label="Дата" {
  Text item=Date
 }
}


Иконки хранятся тут openHAB/webapps/images. Скачать дополнительные можно тут.

Создадим новый файл: Items/home.items, прочитав документацию по Items. Так как у нас 1-wire, читаем документацию по связи с openHAB тут, и правим файл конфигурации в секции OneWire Binding (собственно говоря я только прописал ip - onewire:ip=127.0.0.1). Формат записи item:
itemtype itemname ["labeltext"] [<iconname>] [(group1, group2, ...)] [{bindingconfig}]

Group All
Group Hall   (All)

/* Indoor Temperatures */
Number Temperature_Hall  "Температура [%.1f °C]" <temperature> (Hall) { onewire="28.1A821E040000#temperature" }

/* NTP binding demo item */
DateTime  Date   "Дата [%1$tA, %1$td.%1$tm.%1$tY]" <calendar> { ntp="Europe/Moscow:ru_RU" }


Копируем созданные файлы, исправленный openhab.cfg на сервер.
Меняем владельца папки с сервером на обычного пользователя и запускаем:

$/srv/openHAB$ ./start.sh
UnknownHostException: 


И получаем ошибку. Ну я получил. :) Прописать надо имя хоста в /etc/hosts на 127.0.0.1. Запускаем еще раз.

$ ./start.sh
Launching the openHAB runtime...
osgi> 23:20:46.100 INFO  o.o.c.internal.CoreActivator[:92] - openHAB runtime has been started (v1.3.1).
.........
23:21:17.223 INFO  o.o.u.w.i.s.WebAppServlet[:99] - Started Classic UI at /openhab.app
23:21:29.349 INFO  o.o.c.s.AbstractActiveService[:189] - NTP Refresh Service has been started
23:21:29.655 INFO  o.o.c.s.AbstractActiveService[:189] - HTTP Refresh Service has been started

Довольно долгий запуск таки. Заходим http://openhab-srv:8080/openhab.app?sitemap=home .



Дата на английском. Смотрим локали:

# locale -a
C
C.UTF-8
en_US.utf8
POSIX
Запускаем, выбираем там ru_RU.UTF-8 UTF-8 и перезапускаем сервер.:
$ sudo dpkg-reconfigure locales 
$ export LANG=ru_RU.UTF-8
или
$ sudo echo "LANG=en_US.UTF-8" > /etc/default/locale


Ну вот немного обрусевший вид.



Если что-то не работает, можно посмотреть более детальные логи, прописав в logback.xml <logger level="INFO" name="org.openhab"> на <logger level="DEBUG" name="org.openhab"> и <logger level="DEBUG" name="org.openhab.binding.onewire"> (для примера смотрите logback_debug.xml). Или просто запустив start_debug.sh - в этом случае сообщения смотрим прямо в консоли.

Запускаем сервер и смотрим.




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

Продолжение следует!

8 января 2014 г.

Безопасный доступ к OpenRemote

Мы создали первое приложение в OpenRemote в локальной сети. Но ясное дело , что управлять то мы хотим не только из локальной сети, а еще и через интернет. Это означает, что нам надо обеспокоиться нашей безопасностью. Ну и самые элементарные вещи это - внедрение парольной защиты и шифрование трафика между клиентом и контроллером.

1. Зашифрованное соединение.

Очевидно, что для шифрования трафика надо использовать https. Подготовим самоподписанные сертификаты в директории /home/openremote/.keystore:

$ keytool -genkey -alias tomcat -keyalg RSA -validity 3600 -keystore ~/.keystore

Когда спросят про второй пароль его вводить не надо - вы обязаны оставить прежний (по умолчанию). Далее переходим в файл /srv/openremote/conf/server.xml и правим следующий кусок:

    
<connector clientauth="false" keystorepass="changeit" 
maxthreads="150" port="8443" protocol="HTTP/1.1" scheme="https" 
secure="true" sslenabled="true" sslprotocol="TLS">

Внимание, мы не только его раскомментировали, но и добавили keystorePass="changeit" - пароль, который вводили при генерации сертификатов. Пробуем запускать скрипт с параметром run - так видно логи сервера. Заходим https://192.168.xx.xx:8443/webconsole/ - должно работать. Теперь закомментируем небезопасный порт 8080, чтобы протестировать клиентов.

Пробуем андроид клиент - в нем адрес контроллера оставляем, только нажимаем на кнопочку SSL в самом низу настроек. Порт указан там же. Теперь пробуем онлайн webconsole, тут по-другому. Удаляем старый адрес контроллера, вводим новый https://192.168.xx.xx:8443/controller/

2. Авторизация.

Хорошо, с шифрованным соединением решили. Авторизация тоже заложена в системе, но немного не явным образом. Для начала правим файл: /security/users.xml:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="openremote"/>
  <user username="vermus" password="test" roles="openremote"/>
</tomcat-users>


Потом открываем файл webapp/controller/WEB-INF и расскоментируем следующие строки:
<!-- Constraint resource: /rest/control/* -->
  
    <security-constraint>
      <web-resource-collection>
        <web-resource-name>Control command RESTful service of Openremote Controller</web-resource-name>
        <description>Control command RESTful service of Openremote Controller</description>
        <url-pattern>/rest/control/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
      </web-resource-collection>
      <auth-constraint>
        <role-name>openremote</role-name>
      </auth-constraint>
    </security-constraint>
  

  <!-- Constraint resource: /rest/panel/* -->
  
    <security-constraint>
      <web-resource-collection>
        <web-resource-name>Panel identity RESTful service of Openremote Controller</web-resource-name>
        <description>Panel identity RESTful service of Openremote Controller</description>
        <url-pattern>/rest/panel/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
      </web-resource-collection>
      <auth-constraint>
        <role-name>openremote</role-name>
      </auth-constraint>
    </security-constraint>
  

  
   <security-constraint>
     <web-resource-collection>
       <web-resource-name>Status command RESTful service of Openremote Controller</web-resource-name>
       <description>Status command RESTful service of Openremote Controller</description>
       <url-pattern>/rest/status/*</url-pattern>
       <http-method>GET</http-method>
       <http-method>POST</http-method>
     </web-resource-collection>
     <auth-constraint>
       <role-name>openremote</role-name>
     </auth-constraint>
   </security-constraint>
   <security-constraint>
     <web-resource-collection>
       <web-resource-name>Polling command RESTful service of Openremote Controller</web-resource-name>
       <description>Polling command RESTful service of Openremote Controller</description>
       <url-pattern>/rest/polling/*</url-pattern>
       <http-method>GET</http-method>
       <http-method>POST</http-method>
     </web-resource-collection>
     <auth-constraint>
       <role-name>openremote</role-name>
     </auth-constraint>
   </security-constraint>
  
 
    <login-config>
      <auth-method>BASIC</auth-method>
      <realm-name>OPENREMOTE_Controller</realm-name>
    </login-config>
    <security-role>
      <role-name>openremote</role-name>
    </security-role>
</pre>


Заходим в webconsole и при клике на выбранной панели система спросит нас логин с паролем. Приложение для андроид (кстати, качайте последнее с сайта, в google play на данный момент 2.0.0 , который даже не поддерживает https).

Итак, мы неплохо обезопасили нашу систему, жаль что для новичков эти шаги были бы не очевидными. Плюс меня еще смущает: древняя версия openremote под андроид в гугл плей, отсутствие внятной документации, онлайновый дизайнер, отсутствие сбора данных, ориентированность на платный продукт и т.п....
В общем, я решил испробовать другую систему openhab, которая лишена всех этих недостатков, хоть в ней вроде бы и есть проблема с 1-wire. Я думаю ее можно как-то решить, кроме owserver же есть еще и owhttpd (может http binding сработает) и owfs (может можно писать в файлы локально). Хоть ее и начали писать позже openremote кстати! Но по моим наблюдениям она гораздо динамичнее развивается. В общем, будем смотреть!

5 января 2014 г.

Платформа умного дома OpenRemote. Знакомство. Подключаем 1-wire через owfs.

Пока я жду DS2406P+ и DS2408S+ занялся серверной и клиентской стороной умного дома.

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

OpenRemote это:

1) Сервер умного дома, работает на десятке платформ, даже на NAS Synology и Windows.

2) Онлайн-cреда для разработки приложения.

3) Мобильное приложение, которое загружает данные для своей работы из среды для разработки.




Поддерживаемые технологии.
AMX, KNX, Lutron, Z-Wave, 1-Wire, EnOcean, xPL, Insteon, X10, Infrared, Russound, GlobalCache, IRTrans, XBMC, VLC, panStamps, Denon AVR, FreeBox, MythTV и другие.

У нас есть owfs с показаниями термометра. Давайте посмотрим как нам связать все это дело воедино.

Установка.

Сubietruck похож на Raspberry Pi, поэтому мы воспользуемся следующим мануалом.

Процессор в Cubietruck версии ARMv7, который поддерживает операции с плавающей точкой на аппаратном уровне (Hard-float). Наш Debian ( ARMv7 (EABI hard-float ABI, «armhf») ) также поддерживает.

Вообще пишут, что использование java машины с плавающей точкой на аппаратном уровне может иметь проблемы со стабильностью и совместимостью. Посмотрим, что у нас в дебиане. Перед тем как ставить java я немного изучил возможные проблемы и какую все таки версию ставить. Читаем комментарий ANDREAS DROLLINGER по ссылке - в нем написано:

OpenJDK (IcedTea6 Zero VM) is slower than Oracle Java, but it is available for hard float installation and the Drools rule engine 5.1.1 works.


В общем-то рекомендует нам использовать OpenJDK 6 с IcedTea6 (с поддержкой таки hard float), оно немного помедленней, ну и ладно, у нас нагрузка не высокая, будет критично - переустановим. Смотрим, что есть у нас в наличии.

root@debtruck:~# apt-cache search icedtea-6-jre
icedtea-6-jre-cacao - Alternative JVM for OpenJDK, using Cacao
icedtea-6-jre-jamvm - Alternative JVM for OpenJDK, using JamVM


Судя по довольно интересным статье сравнения JamVM немного получше, чем Cacao, поэтому буду пробовать его. Ставим:

# apt-get install icedtea-6-jre-jamvm
root@debtruck:~# which java
/usr/bin/java
# java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1)
root@debtruck:~# which java
/usr/bin/java
# java -jamvm -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1)
JamVM (build 1.6.0-devel, inline-threaded interpreter with stack-caching)
# export JAVA_HOME=/usr

Редактируем /etc/java-6-openjdk-armhf/jvm-armhf.cfg перенеся -jamvm KNOWN в начало списка.

# java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1~deb7u1)
JamVM (build 1.6.0-devel, inline-threaded interpreter with stack-caching)

Видим, что у нас JamVM используется по умолчанию.

Качаем контроллер.
# cd /usr/src/
# wget http://download.openremote.org/

У меня скачался OpenRemote-Controller-2.1.0_SNAPSHOT-2013-06-17.zip.

Настройка и использование OpenRemote

Теперь давайте создадим пользователя под которым будет запускаться контроллер. ( #adduser openremote , #su openremote ). Создадим под root директорию /srv/or/ дадим chown openremote на нее. Распакуем архив в нее.
$ cd /srv/or/bin
$ chmod +x openremote.sh
$ ./openremote.sh run
....
INFO: Server startup in 19386 ms
Регистрируемся на сайте. Заходим в online редактор. Я обычно не доверяю таким онлайн штукам. Но да ладно, в принципе есть исходники - пишут, что можно и оффлайн устанавливать дизайнер, но пока я смысла в этом не вижу. Создаем новый Device.



Теперь создаем команду (тут можно не прописывать хост и порт каждый раз в версии 2.2, там есть config for controller onewire. В версии 2.1. пока его нет).



Теперь создаем сенсор.



Теперь перейдем во вкладку "Дизайн". Создадим новую панель Android (у меня только андроид :) ). Добавим в нее пару Label - один просто текст, во втором выберем наш сенсор. Ну вот вроде и готово. Перейдем по адресу http://openremoteserver:8080/controller/ и нажмем Sync with Online Designer, тем самым загрузим созданное приложение на контроллер OpenRemote (Что интересно, можно делать это и оффлайн, тем самым сохранив бекап с приложением - в онлайн редакторе есть возможность сохранить приложение как zip файл, а на контроллере импортировать). После синхронизации заходим на веб-консоль ( http://192.168.xx.xx:8080/webconsole/ ) и нажимаем найти контроллер, после этого вебконсоль находит наш локальный контроллер, нажимаем на него и видим наше созданное приложение. И опять не работает. :)

Проблема вот в чем, по умолчанию owserver отвечает только по адресу localhost:4304 , то есть контроллер по имени благополучно подключается, а вот по ip (127.0.0.1) нет. Поэтому пропишем так server: port = 127.0.0.1:4304 (для доступа из сети просто пишем server: port = 4304) в owfs.conf. Перезапускаем сервер owserver: #service owserver restart . Работает:



Для установки приложения на мобильный телефон, устанавливаем приложение для андроид и оно само находит контроллер в локальной сети - подключаемся, работает.
Добавляем строчку cd /srv/openremote/bin в openremote.sh, иначе при запуске из другого места могут вылезти косяки. Скрипт init.d для контроллера

#!/bin/sh
### BEGIN INIT INFO
# Provides:          openremote
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

#!/bin/sh

User=openremote
orpass=/srv/openremote/bin

case "$1" in

stop)
        echo "Stopping OpenRemote Controller..."
        su -l $User -c "$orpass/openremote.sh stop" > /dev/null 2>&1 &
        ;;

start)
        # start OpenRemote in background mode
        su -l $User -c "$orpass/openremote.sh start" > /dev/null 2>&1 &
        echo "OpenRemote Controller started..."
        ;;

restart)
        $0 stop
        sleep 5
        $0 start
        ;;
*)
        echo "usage: $0 { start | stop | restart}" >&2
        exit 1
        ;;

esac

Ну и автозапуск update-rc.d.

ps. Вообще для доступа через интернет ip адрес контроллера должен быть внешним.

2 января 2014 г.

Создание термометра в сети 1-wire

Итак, мы научились подключать устройство 1-wire к контроллеру.

Оффтопик. Давайте-ка я все-таки расскажу что и где покупал.
1. Cubietruck - здесь.
2. Контроллер DS9490R, термометр DS18B20 - здесь.
3. Прототипные платы - здесь.
4. Проводочки :) - 30 ft Kynar wire wrap wire 30 awg 4 modding 10 color.
5. 100 штук RJ11\12 - 100× Modular Lan Network Connector Plug RJ11 6P6C CAT5
6. Остальное в местном радио магазине (включая внешние телефонные розетки и некоторые разъемы по питанию).

Для создания термометра используем схему с сайта Бенукс (сайт вообще отличный, самое лучшее и доступное описание 1-wire сети и устройств).

Травить плату я не умею (хотя в инете полно видео технологии ЛУТ - может быть в скором времени и попробую), поэтому решил делать на прототипных платах - схема в принципе не такая сложная:



По схеме: в принципе ничего сложного даже для такого новичка, как я. 78L05 - стабилизатор, преобразует 12 вольт на нашей шине в 5 вольт для датчика. Кстати! Мы приведем сеть 1-wire в порядок и пустим по ней 12 вольт, не будем использовать паразитное питание. Остальные элементы описаны разработчиком схемы (обсуждение немного другой платы, поэтому 5 пункт можно не читать и обозначения не все совпадают - но я думаю догадаться можно о чем речь):

1. Диод D6 - для каких целей он служит и почему выбран именно КД521?
Этот диод уменьшает влияние "просадок" по общей шине питания на данный модуль. Здесь допускается применение любого маломощного выпрямительного диода. КД521 взят только потому, что был под рукой.

2. Конденсатор C2 - для каких целей он служит? Ведь в datasheet к 7805 указаны только 2 конденсатора, по 0,33 и 0,1 соответственно.
Во время "просадок" питания по общей шине этот конденсатор поддерживает питание данного модуля.

3. Сопротивление R2 - почему именно 100 Ом?
Оптимальный номинал, который с одной стороны является элементом защиты, а с другой стороны не оказывает большого влияния на полезные сигналы 1-wire.

4. Стабилитрон D3 - почему выбран именно КС156?
Этот элемент совместно с резистором R2 является цепочкой защиты модуля от импульсных помех по микросети. Выбран с несколько большим напряжением, чтобы не влиять на полезный сигнал 1-Wire и Pullup, а "срезать" случайные импульсные помехи превышающие 5,6 В.

5. Действительно ли так нужна опторазвязка на схеме между DS2413 и реле, или можно обойтись транзистором + реле?

Можете исключить опторазвязку, но тогда при работе через USB-адаптер может быть подвисание порта.

Приступили к пайке схемы, предварительно разрезав плату ножницами по металу под внешнюю телефонную розетку и пролудив ее. Получили нечто вроде этого (микросхему пока не паяем, сначала хочу проверить вольтаж).



Теперь надо сделать саму шину. Для этого я купил 6 контактные телефонные разъемы (RJ12 в простонародии - почитайте вики, чтобы не купить что-нибудь не то) по цене примерно 200 рублей за 100 штук (см. пункт 5 в закупках). Я решил обжимать по схеме B в RJ45 (без оранжевого и светло-оранжевого) ибо уже привык к ней :) , запишем распиновку. Теперь обжимаю все шесть проводов, а не как в прошлом посте, так обжимка получается качественнее.



У меня вид с обратной стороны по B (то есть контакты от 8 до 3 включительно)



1. Светло-зелёный - не используется.
2. Синий - черный в розетку - +12 вольт.
3. Светло-синий - красный в розетке - Data.
4. Зелёный - зелёный в розетке - земля.
5. Светло-коричневый - жёлтый в розетке - +18 вольт.
6. Коричневый - свободный.

"Организатор" шины

Теперь я подумал как же мы будем подключать 18 и 12 вольт? Ну и решил взять еще одну розетку и сделать из нее некий переходник-организатор (дурацкое название, что-то сейчас лучше в голову не пришло :) ).



Смотрим распиновку. Нам нужны только 3 и 4 контакты. Обжимаем как хотим один конец (советую выщипать лишние контакты), а второй оставляем - его будем впаивать в макетплату.

Разбираем розетку, паяем. У меня получилось вот так вот



Обжимаем еще один провод. Мультиметром проверяем работу схемы и правильность соединений. Проверяем 12 вольт на шине. 18 вольт у меня пока нет. Чтобы было удобнее пользоваться мультиметром - подключаем по розетке на оба конца:



Пробуем вставлять наш термометр, пока без DS18B20. Проверим напряжение 5 вольт.



Последний шаг - впаиваем DS18B20 в плату под термометр. Распиновка:



У меня заработало не сразу. :) Вышла небольшая заминка по проводам. Поэтому прежде чем обжимать коннектор в DS9490R выщипайте лишние контакты в коннекторе, оставьте два посередине и только после этого обжимайте.
В итоге, у нас есть первое устройство в "нормальной" сети 1 wire, которую можно расширять не боясь. Еще я понял, что лучше все-таки травить плату, это наверное быстрее (если конечно есть работающий макет), чем использовать такие вот прототипные платы (хотя может их надо как-то по другому использовать, я честно говоря не знаю. :) ) и качественее.

Кусочек информации с моего термометра:

power YES (1)
r_address 710000041E821A28
r_id 0000041E821A
r_locator FFFFFFFFFFFFFFFF
temperature  26.3125
temperature10  26.25
temperature11  26.375
temperature12  26.3125
temperature9  26.5


Система в сборе



ps. Кстати, неплохо бы в наш дебиан еще поставить системные логи:
#apt-get install rsyslog

24 декабря 2013 г.

Подключение контроллера сети 1-wire (DS9490R) к Cubietruck. Первое устройство в сети 1-wire (ds2401).

Ну что, теперь можно раскрыть секрет - не просто так же покупался cubietruck. А покупался он для создания сети умного дома 1-wire. Что это такое рассказывать не буду, в интернете полно информации. Просто буду записывать некоторые не очевидные для меня, как чайника вещи. Итак, для начала подключим контроллер DS9490R к нашему cubietruck.
Вставляем контроллер в cubietruck.


# dmesg
[  512.230242] The port change to OHCI now!
[  512.532997] usb 5-1: new full-speed USB device number 2 using sw-ohci
# apt-get install owfs
# lsusb
Bus 005 Device 003: ID 04fa:2490 Dallas Semiconductor DS1490F 2-in-1 Fob, 1-Wire adapter
# mkdir /mnt/1wire
# owfs -C -uall -m /mnt/1wire --allow_other
# ls -lah /mnt/1wire
total 4.0K
drwxr-xr-x 1 root root    8 Dec 24 06:15 .
drwxr-xr-x 4 root root 4.0K Dec 24 06:14 ..
drwxrwxrwx 1 root root    8 Dec 24 06:16 05.4AEC29CDBAAB
drwxrwxrwx 1 root root    8 Dec 24 06:16 10.67C6697351FF
drwxrwxrwx 1 root root    8 Dec 24 06:16 81.EE6F32000000
drwxr-xr-x 1 root root    8 Dec 24 06:15 alarm
drwxr-xr-x 1 root root    8 Dec 24 06:15 bus.0
drwxr-xr-x 1 root root    8 Dec 24 06:15 bus.1
drwxr-xr-x 1 root root    8 Dec 24 06:15 settings
drwxrwxrwx 1 root root    8 Dec 24 06:16 simultaneous
drwxr-xr-x 1 root root    8 Dec 24 06:15 statistics
drwxr-xr-x 1 root root   32 Dec 24 06:15 structure
drwxr-xr-x 1 root root    8 Dec 24 06:15 system
drwxr-xr-x 1 root root    8 Dec 24 06:15 uncached

Информация:
owfs - это программа, которая отображает сеть в виде файловой системы. То, что owfs совпадает с названием всего пакета - чистая случайность.
owhttpd - это программа, которая делает доступной сеть по HTTP протоколу (по-народному, через браузер)
И та и другая программы могу работать с мастером сети самостоятельно, но не вместе!
Чтобы owfs и owhttpd работали одновременно, нужно запустить owserver.
owserver -u -p 3000
Запускает сервер работы с сетью, -u значит физическое устройство USB типа DS9490R, и отвечает на запросы по 3000 порту.
owhttpd -s 3000 -p 3001
-s 3000 - порт, на котором запущено owserver
-p 3001 - порт, на котором owhttpd сам отвечает по протоколу HTTP
owfs -s 3000 /mnt/1wire/
-s 3000 понятно, дальше идет mount point, который является обязательным параметром

Пробуем зайти http://192.168.xx.xx:2121/

Добавим в /etc/modprobe.d/fbdev-blacklist.conf (чтобы не использовать модули ядра линукс, а брать из пакета owfs)
blacklist ds9490r
blacklist ds2490
blacklist wire


Редактируем файл /etc/owfs.conf
# Sample configuration file for the OWFS suite for Debian GNU/Linux.
# This is the main OWFS configuration file. You should read the
# owfs.conf(5) manual page in order to understand the options listed
# here.
######################## SOURCES ########################
# With this setup, any client (but owserver) uses owserver on the
# local machine...
! server: server = localhost:4304
# ...and owserver uses the real hardware, by default fake devices
# This part must be changed on real installation
#server: FAKE = DS18S20,DS2405
# USB device: DS9490
server: usb = all
# Serial port: DS9097
#server: device = /dev/ttyS1
# owserver tcp address
#server: server = 192.168.10.1:3131
# random simulated device
#server: FAKE = DS18S20,DS2405
######################### OWFS ##########################
mountpoint = /mnt/1wire
allow_other
####################### OWHTTPD #########################
http: port = 2121
####################### OWFTPD ##########################
ftp: port = 2120
####################### OWSERVER ########################
server: port = localhost:4304


Редактируем /etc/fuse.conf:
# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#
#mount_max = 1000  

# Allow non-root users to specify the 'allow_other' or 'allow_root'
# mount options.
#

user_allow_other


После этого монтировать можно командой # owfs. Хотя в прицнипе монтирование нам особо и не нужно ибо есть tcp owserver, монтировать датчики в файловую систему удобно для тестов. Поэтому процесс автомонтирования при загрузке рассматривать не будем (примеры скрипта можно найти в сети) update. или здесь.

Создание сети 1-wire.

Небольшой ликбез по поводу сети 1-wire для новичков как я (после моего месячного изучения урывками). Если профи увидят ошибки, прошу комментировать. Итак, сеть 1-wire - сеть на одной шине, компоненты которой подключаются последовательно. Компонентами могут выступать как уже готовые микросхемы с датчиками и так и микросхемы управления вводом\выводом (то есть для подключения дополнительных цифровых или аналоговых датчиков). В сети 1-wire по умолчанию всего два контакта - data и земля. В data передаются данные (как видно по названию), а также т.н. паразитное питание. То есть можно использовать всего два провода. Вначале я не очень понимал это принцип, поэтому накупил штук 10 ds2401 которые как раз от него и работают - сегодня будем тестировать сеть на них. Так вот, строить сеть на паразитном питании (питание идет с контроллера DS9490R) можно, но не нужно. :) Для пары датчиков и короткой шине можно использовать паразитное питание, а вот если шина длиной более 30 метров и датчиков много - ожидается просадка по напряжению, поэтому умные люди придумали (по ссылке много интересного про 1wire) и используют отдельное питание 5V, но не простое, а канал с повышенным напряжением. По ссылке прекрасно все описано. Я лишь дополню зачем это надо - 12 V в каждом модуле преобразуется стабилизатором в 5V, а 18V в 12V. Это сделано для того, чтобы даже при просадке напряжения в шине на компоненты гарантировано поступало 5V и на некоторые датчики 12V. Далее, сразу используем витую пару 5ой категории, чтобы не переделывать потом. Для коммутации также используем телефонные (rj11\12) коннекторы и внешние телефонные розетки.
Ну вот в принципе и все.

Делаем первое устройство сети 1-wire.

Сейчас мы будем делать устройство с паразитным питанием, потому что пока у меня нет нужной микросхемы 1-wire с внешним питанием. Тырим одну картинку по ссылке выше:



Итак, используем так:
светло-зеленый:data (3ий пин в контроллере)
зеленый:земля(GRND) (4ый пин в контроллере)


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


Подключать мы будем устройство, которое выдает уникальный id (например, если устройство с определенным id доступно - дверь закрыта, а если не доступно - значит дверь открыта) - ds2401. Нагло тырим еще одну картинку с форума.



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


Подключаем (геркон замкнут - вот эти две коричневые цилиндрические штуки и есть магнит с герконом):
/mnt/1wire# ls -l
total 0
drwxrwxrwx 1 root root  8 Dec 24 14:47 01.E890ED150000
drwxrwxrwx 1 root root  8 Dec 24 14:47 81.EE6F32000000
drwxr-xr-x 1 root root  8 Dec 24 10:12 bus.0
drwxr-xr-x 1 root root  8 Dec 24 10:12 settings
drwxr-xr-x 1 root root  8 Dec 24 10:12 statistics
drwxr-xr-x 1 root root 32 Dec 24 10:12 structure
drwxr-xr-x 1 root root  8 Dec 24 10:12 system
drwxr-xr-x 1 root root  8 Dec 24 10:12 uncached

/mnt/1wire/01.E890ED150000# cat type
DS2401

/mnt/1wire/01.E890ED150000# cat r_address
A9000015ED90E801

/mnt/1wire/01.E890ED150000# cat id
E890ED150000

Вот у нас и новый элемент сети 1-wire. r_address это и есть уникальный id ds2401, который по идее гарантирует уникальность микросхемы. Я брал в китайском интернет магазине, где-то слышал что они штампуют все под одну гребенку (надо будет поставить вторую ds2401 и проверить). Пробуем убрать магнит от геркона. Смотрим - элемент отсутствует. Вот вам и элементарная проверка на открытую дверь. Я пока не выбрал (может кто посоветует) систему, которая все эти данные собирает в базу, имеет веб-интерфейс и разные плюшки (например работа с tcp сервером 1-wire, jabber), пока в поиске. Но смысл понятен.
Обратите внимание, что появление датчика в сети 1wire может занять некоторое время (около 15 секунд, а может и больше).
ps. Почти все элементы покупались онлайн, могу поделиться ссылками.