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 - в этом случае сообщения смотрим прямо в консоли.

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




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

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

38 комментариев:

  1. Удачно наткнулся на статью! Сам пока пользуюсь только 1-wire, но планирую и другие технологии. Давно искал подобный "комбайн".

    ОтветитьУдалить
  2. Приветствую!
    У меня на этапе открытия демо конфигурации выскакивает ошибка:
    An error occurred while opening the configuration folder
    Cannot create linked resource '/config/config'. The parent resource is not accessible.
    Что это может быть?

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

    https://groups.google.com/forum/#!msg/openhab/vQbnDFCXjLE/gVxovi8WaQQJ

    пишут, надо удалить .workspace и перезапустить дизайнер.

    ОтветитьУдалить
  4. Еще мне не понятно немного с привязкой Z-wave...
    по логу видно что все проинициализировалось и начинает слать в порт который я прописал.... но возникает вопрос как openhab может использовать порт который уже занят сервером z-wave?!

    ОтветитьУдалить
    Ответы
    1. Один порт использовать нельзя (вы какой порт имеете ввиду?) , z-wave я не занимался.

      Удалить
    2. у меня комп BananaPI (китайский аналог RasberryPI) на него установлен модуль Z-wave RaZberry, который сконфигурирован как /dev/ttyS0. Сервер Z-wave установлен на банане и сервер openhab тоже тут же! так вот в настройках openhab нужно тоже указывать порт на котором сидит модуль Z-wave. от сюда и вопрос?! или может openhab может работать с Z-wave и без его родного сервера?!

      Удалить
    3. ну судя по документации openhab умеет работать напрямую с устройством
      https://github.com/openhab/openhab/wiki/Z-Wave-Binding

      The Razberry-Zwave-Daughterboard - это похоже на ваше устройство

      The zwave:port value indicates the serial port on the host system to which the Z-Wave controller is connected, e.g. "COM1" on Windows, "/dev/ttyS0" or "/dev/ttyUSB0" on Linux or "/dev/tty.PL2303-0000103D" on Mac.


      То есть , пишем zwave:port=/dev/ttyS0 и всё, если я правильно понял.

      Удалить
    4. ps. тут порт имеются виду serial port , это не tcp\ip port.

      Удалить
  5. У меня при запуске биндинга выходит вот такая ошибка:
    09:55:56.569 INFO o.o.c.s.AbstractActiveService[:169]- OneWire Refresh Service has been started
    09:56:01.687 ERROR o.o.c.s.AbstractActiveService[:175]- Error while executing background thread OneWire Refresh Service
    java.lang.NullPointerException: null
    at org.owfs.jowfsclient.internal.OwfsClientImpl.sendRequest(OwfsClientImpl.java:509)
    at org.owfs.jowfsclient.internal.OwfsClientImpl.exists(OwfsClientImpl.java:385)
    at org.openhab.binding.onewire.internal.OneWireBinding.execute(OneWireBinding.java:140)
    at org.openhab.core.binding.AbstractActiveBinding$BindingActiveService.execute(AbstractActiveBinding.java:156)
    at org.openhab.core.service.AbstractActiveService$RefreshThread.run(AbstractActiveService.java:173)
    И данных с датчиков в openhab нету!!! ((((
    В чем может быть проблема?

    ОтветитьУдалить
    Ответы
    1. а в файловой системе owfs или owhttpd данные есть? и покажите строку item

      Удалить
  6. При старте owfs в папке /mnt/1-wire/ появляются все датчики температуры подключенные к шине.... в файле w1_slave данные температуры есть и меняются при нагреве....
    вот мой итем:
    Number Temp "Температура_1 [%.1f C]" { onewire="28-00043d8b95ff#temperature"}

    ОтветитьУдалить
    Ответы
    1. По-моему, в названии датчика, должна быть точка вместо дефиса, и после точки все заглавные (скопируйте название с названия директории датчика) - в линуксе почте все чувствительно к регистру. Должно быть, примерно как у меня:
      28.1A821E040000

      Удалить
  7. Да я посмотрел и действительно в папке /sys/bus/w1/devices/ у меня создается файл с дефисом, а в /mnt/1-wire/ с точкой и все в верхнем регистре!!! поправил, но ничего не поменялось. Сразу вопрос: запускать нужно только owfs или еще что то?

    ОтветитьУдалить
    Ответы
    1. понятно, верхее это что-то системное.

      В тексте есть ссылка на статью про owfs. owfs - это название пакета с несколькими утилитами, в том числе owfs (то самый /mnt/1-wire/ ) (one wire file system) и owserver - tcp сервер к которому и подключается openhab. то есть он должен работать.
      Плюс в конфиге надо прописать его ip (если на той же машине onewire:ip=127.0.0.1 )

      https://github.com/openhab/openhab/wiki/One-Wire-Binding

      Удалить
    2. Ну в конфиге openhab именно так и прописано! )
      А по мимо owserver и owfs еще нужно что то запускать? может есть где нибудь скриптик, который запускает все что нужно?!

      Удалить
    3. К сожалению, у меня хост с 1wire сейчас не работает. Кажется, я ставил из репозитория дебиана и там в комплекте идет скрипт запуска в init.d.

      посмотрите в owfs.conf, там должны быть строчки типа:

      ####################### OWSERVER ########################
      server: port = localhost:4304

      после запуска попробуйте
      #telnet localhost:4304

      Удалить
    4. Вот здесь есть скрипт запуска
      http://www.gaggl.com/2013/01/accessing-1-wire-devices-on-raspberry-pi-using-owfs/

      Удалить
  8. Дело в том что я так понял что у меня 1-wire (w1) уже предустановлен в ядре линукса... просто глянул на банане пи там нет папки w1 в директории /sys/bus/ а вот на банане про есть.... я вот думаю, а они не могут друг другу мешать? ну в смысле то что в ядре и то что я пытаюсь запускать сам?

    ОтветитьУдалить
    Ответы
    1. не думаю, в ядре могуть быть только драйвера, а owfs это и драйвера и софт. Если работают датчики в файловой системе в /mnt, то и в owserver должны. Но тут есть одна тонкость, надо запускать сначала owserver (tcp сервер), а потом owfs (файловая система) или там owhttd (веб север), потому что owfs и owhttpd могут работать и сами, но если они видят, что есть tcp сервер, то подключаются к нему. Я просто не уверен, что owserver будет корректно работать , если его запустить после owfs или owhttd. Но проверить не могу - это то что я припоминаю :)

      Удалить
  9. Я запускаю сначала owserver с параметром --w1 а потом запускаю owfs --w1 с тем же параметром... может не надо параметры указывать? в сети информации об этом нет! хотя да, действительно я где то видел, что сначала запускается сервер а потом "шина"!

    ОтветитьУдалить
    Ответы
    1. owfs --w1 что это за параметр?

      вот скрипт готовый для debian like систем, использующий /etc/owfs.conf для запуска

      http://www.gaggl.com/2013/01/accessing-1-wire-devices-on-raspberry-pi-using-owfs/

      телнетом все-таки проверьте работу вашего owserver

      Удалить
  10. телнет молчит((( говорит нет сервиса....

    ОтветитьУдалить
  11. хотя в htop вижу что owserver запущен и owfs запущен

    ОтветитьУдалить
    Ответы
    1. owfs не нужен , его можно вырубить .
      я ошибся , там без двоеточния надо
      #telnet localhost 4304

      Удалить
  12. так там используется USB адаптер а у меня подключено на gpio=4 а вы делали на адаптере или к gpio подключали шину?!

    ОтветитьУдалить
  13. Ответы
    1. Значит у вас не работает правильно tcp сервер, который и использует OpenHAB
      А если посмотреть какой порт использует
      #netstat -ap | grep owserver
      А в логах есть что по поводу owserver

      Удалить
  14. tcp 0 0 *:4304 *:* listen 29663/owserver
    unix 2 [ ] dgram 215832 29663/owserver

    ОтветитьУдалить
  15. я не нашел логи... их наверное нужно включать где то! я запускаю с debug и все события полностью в консоли

    ОтветитьУдалить
    Ответы
    1. ну вроде все правильно на первый взгляд , и что телнет не подключается?
      логи в консоли это тоже самое, что и лог (в syslog по-моему он пишет).
      Странно. Слушайте, по-моему был косяк с локалхостом.
      Попробуйте прописать

      ####################### OWSERVER ########################
      server: port = 127.0.01:4304

      и телнетом
      telnet 127.0.0.1 4303 после запуска...
      Что-то припоминаю такое...

      Удалить
    2. точку пропустил
      ####################### OWSERVER ########################
      server: port = 127.0.0.1:4304

      Удалить
  16. Дело в том, что у меня нет /etc/owfs.conf он лежит в другом месте и там нет таких параметров!!! я сейчас установил по вашей ссылке на другой плате, там этот файл есть и по локалхосту телнет прицепился! вот только там нет настроек для w1... а usb адаптера у меня нет... да и дорогой он... я думал что раз в kernel есть 1-wire нафига еще адаптер за 1500 рубля! Ж-)

    ОтветитьУдалить
    Ответы
    1. при чем тут адаптер? если у вас owfs отрабатывает и датчики в mnt/1wire появляются то и сервер должен работать. Не важно, где лежит конфиг. можно запускать с конфигом без всяких скриптов:
      #owserver -c owfs.conf

      главное, чтобы в конфиге было прописано

      server: port = 127.0.0.1:4304

      и раз у вас не usb, то нечто вроде этого:

      https://gist.github.com/kmpm/4445289

      server: i2c = ALL:ALL

      Удалить
  17. Вот кстати ссылка на драйвер для ядра линуха )))))
    http://owfs.org/index.php?page=w1-project
    жаль что я не программист и не могу понять где косяк с подключением по этой схеме!?(((

    ОтветитьУдалить
    Ответы
    1. Аа, ну так есть поддержка и параметр теперь я понял какой.
      тогда в конфиге
      server: w1
      server: port = 127.0.0.1:4304
      и запуск #owserver -c owfs.conf

      может так сработает?

      Удалить
    2. Все заработало! у меня проблема с доступом по локалхосту... вылечилось командой ifconfig lo 127.0.0.1 команды для запуска 1-wire:
      ./owserver --w1 -p4304
      ./owfs --w1 -s4304 -m /mnt/1-wire
      и в openhab все появилось! )))))

      Удалить