Как стать автором
Обновить
0

Работа модулей «Мастер Кит» в системе управления домашней автоматизацией OpenHAB. Часть 3: Часы реального времени

Время на прочтение 5 мин
Количество просмотров 5.4K
Продолжение о работе модулей Мастер Кит в системе управления домашней автоматизацией OpenHAB (начало здесь и здесь).
Эта небольшая статья началась с того, что я задался вопросом: eсли у меня на даче нет постоянно подключенного Интернета, то откуда OpenHAB возьмет информацию о времени и дате?



На ум сразу пришли устройства класса часов реального времени (RTC) и среди них я выбрал мало кому известный модуль MK8900 с USB-подключением. Именно возможность включить его просто в USB-порт мне показалась наиболее привлекательной, в отличие от необходимости что-то мудрить с Ардуино.

Удобства USB-подключения совпало с планом освоения Serial Binding в OpenHAB. В модуле есть датчик температуры, термостат и возможность подергать несколькими ножками микроконтроллера (GPIO), но сегодня это не главное. Загорелся на освоение именно возможности подключения устройств через COM-порт.

Забегу вперед и скажу, в процессе освоения я научился:

— управлять устройством и получать ответ от него;
— достаточно просто вытаскивать из строки ответа время, дату, температуру;
— отображать эти значения в соответствующих полях

Итак, первым делом надо не забыть поместить в папку C:\OpenHab\addons файл org.openhab.binding.serial-1.7.1.jar, это сэкономит вам несколько часов на попытках разобраться, почему ничего не работает (горькая шутка). Далее следует подключить модуль к компьютеру и в Диспетчере устройств Панели управления Windows посмотреть номер порта, который при этом образовался. У меня выпал счастливый номер COM5. Если ваш компьютер не видит устройства, то надо установить драйвер Silicon Labs CP210x USB to UART для вашей операционной системы.

В .sitemap я ничего делать не стал, в конфигурации .cfg так же. Дополнения появились только в файлах testdrive.items и testdrive.rules

Экран тестовой конфигурации стал выглядеть так:



И если войти в раздел «Часы реального времени», то картинка такая



Файлы тестовой конфигурации можно взять на закладке «Скачать»

Подробнее:
В .items я добавил несколько строк, которые создали мне в интерфейсе новую группу для часов и несколько элементов:

Group RTC (All) //Создаем страницу для часов реального времени MK8900

DateTime Date_RTC «Дата: [%1$tA, %1$td.%1$tm.%1$tY]» (RTC)
DateTime Time_RTC «Время: [%tR]» (RTC)
Number MK8900_T «Текущая температура: [ %.1f °C]» (RTC)
Switch Get_Time «Запросить время» (RTC)
String Serial_string «Команда/ответ модуля: [%s]» (RTC) { serial=«COM5» }

Вот эта сложная строка: «Дата: [%1$tA, %1$td.%1$tm.%1$tY]» всего лишь задает формат вывода даты: День недели, день.месяц.год. А эта: «Время: [%tR]» выводит время. Самые внимательные заметят, что время, полученное через Интернет выводится по-другому «Московское время: [%tT]». Я специально заменил букву Т на R в формате в выражении [%tR], поскольку «Т» – выводит на экран секунды, а «R» формирует вывод без секунд. Мне это и нужно, так как модуль MK8900 не выдает информации о секундах.
В остальном обычные элементы, но обратите внимание у Serial_string появилась настройка биндинга
{ serial=”COM5” }. Оказалось, что этого достаточно, чтобы обмен через USB заработал. Именно этот строчный элемент будет передавать команды модулю и получать от него ответ. Его можно не показывать в интерфейсе, но я оставил для наглядности процесса обмена информацией с часами. Значения всех остальных полей заполняются (обновляются) в результате работы Правил (Rules)

Первое правило простое – надо запросить у модуля информацию. Проще всего это сделать командой !GetA

rule «Get_Time ON»
when
Item Get_Time received command
then
if(receivedCommand==ON) Serial_string.sendCommand("!GetA\r")
end

В данном примере я запрашиваю информацию «вручную», с помощью элемента Switch Get_Time и получаю ответ в формате: !14:5608.10.15+2718 Видно, что в строке есть время, дата, текущая температура и даже установка термостата (18), но мы сейчас ее не используем.
Второе правило будет осуществлять разбор ответа и вывод информации в соответствующие поля, выглядит оно так:

rule «MK8900 sends to Openhab»
when
Item Serial_string changed
then
msg = Serial_string.state.toString.trim
var String time_rtc = ""

if (msg.contains(":")) {
time_rtc = «20»+(msg.mid(12,2))+"-"+(msg.mid(9,2))+"-"+(msg.mid(6,2))+«T»+msg.mid(1,5)+":00"
println(«time_rtc ---> » + time_rtc )
postUpdate(Time_RTC, time_rtc)
postUpdate(Date_RTC, time_rtc)
postUpdate(MK8900_T, msg.mid(14,3))
}
end


Внимание! Обязательно надо переменную msg объявить глобальной. Делается это размещением строки var String msg = "" в начале файла .rules между блоками import… и первым правилом rule… Не забудьте это сделать.
Теперь самое интересное, эта строка перехватывает ответ модуля:
msg = Serial_string.state.toString.trim Расшифровывается как состояние элемента Serial_string перевести в строчный тип и отбросить незначащие пробелы спереди. Условие if (msg.contains(":")) (если ответ содержит двоеточие, то) я использую для того, чтобы в обработку попадал только ответ модуля, а не сами команды.
После первого ответа модуля мы получим msg = !14:5608.10.15+2718 Сразу использовать эту строку для обработки мы не можем, так как поле типа DateTime понимает формат такого вида: 2015-10-08T16:41:00. Я это подсмотрел в мониторе OpenHABа по записям обновления даты и времени по сети.



Я рассудил, если преобразовать строку !14:5608.10.15+2718 в строку вида 2015-10-08T16:41:00, то с большой вероятностью смогу вывести информацию в свои поля часов реального времени. Для этого беру еще одну пустую переменную, уже локальную, только для этого правила: var String time_rtc = "". Затем начинаю собирать нужный мне формат даты таким способом:

time_rtc = «20»+(msg.mid(12,2))+"-"+(msg.mid(9,2))+"-"+(msg.mid(6,2))+«T»+msg.mid(1,5)+":00"

Логика построения этого выражения такая: мне нужен год в виде «2015» поэтому беру 20, заключаю в кавычки, это значит, что именно 20 попадет в итоговое значение. Затем уже беру информацию из ответа модуля (msg.mid(12,2)), что означает с 12-го места взять отрезок в 2 символа. Отсчет начинается нуля, на его месте у нас «!». Это 15 и в сумме получится 2015. Затем добавляю «тире» и 2 знака, начиная с 9-го места (это месяц), опять тире, 2 знака числа и т.д. пока не получится нужная мне строка.
Кстати, оказалось очень удобно для отладки использовать в коде правила вот такую строку: println(«time_rtc ---> » + time_rtc) Тогда в мониторе вы будете видеть результат, который у вас получается. Видите строчку --->?



Остается только обновить информацию в нужных мне полях:

postUpdate(Time_RTC, time_rtc)
postUpdate(Date_RTC, time_rtc)
postUpdate(MK8900_T, msg.mid(14,3))


Температуру я обновляю «влет», сразу выдергиваю нужные мне символы. Правда тут есть заморочка с отображением знака «плюс». Но пусть это будет вашим контрольным заданием. Вторым заданием могло бы быть автоматический опрос часов с заданным периодом, думаю это не самое сложное правило с учетом пройденного материала.
Успехов!
Теги:
Хабы:
+6
Комментарии 0
Комментарии Комментировать

Публикации

Информация

Сайт
masterkit.ru
Дата регистрации
Дата основания
Численность
Неизвестно
Местоположение
Россия

Истории