Я решил оповещения сделать на основе 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)!