5 февраля 2014 г.

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

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

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

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


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

  1. rule "Door Check Lock Send"  
  2. when  
  3.         Item Main_Door_Lock changed  
  4. then  
  5.         if(Main_Door_Lock.state==1)  
  6.         {  
  7.             sendXMPP("jabber@jabber.org", "Замок двери открыт!")  
  8.         }  
  9.         else if(Main_Door_Lock.state==0)  
  10.         {  
  11.             sendXMPP("jabber@jabber.org", "Замок двери закрыт!")  
  12.         }  
  13.         else{  
  14.             sendXMPP("jabber@jabber.org", "Неполадки с датчиком замка двери!")  
  15.         }  
  16. end  


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

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

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

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

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

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

items:

  1. 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).
  1. # update-rc.d owfs defaults 30  

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

Комментариев нет:

Отправить комментарий