HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL
РадиоЛоцман - Все об электронике

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

Мастер Кит MK8900

Михаил Сергеев

Продолжение статьи о работе модулей Мастер Кит в системе управления домашней автоматизацией OpenHAB (начало здесь и здесь).

Эта небольшая статья началась с того, что я задался вопросом: если у меня на даче нет постоянно подключенного Интернета, то откуда OpenHAB возьмет информацию о времени и дате?

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

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

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

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

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

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

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

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

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

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

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

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

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

Подробнее:

В .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а по записям обновления даты и времени по сети.

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

Я рассудил, что, если преобразовать строку !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)span>. Тогда в мониторе вы будете видеть результат, который у вас получается. Видите строчку --->?

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

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

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

Температуру я обновляю «влет», сразу выдергиваю нужные мне символы. Правда тут есть заморочка с отображением знака «плюс». Но пусть это будет вашим контрольным заданием. Вторым заданием мог бы быть автоматический опрос часов с заданным периодом; думаю это не самое сложное правило с учетом пройденного материала.

Успехов!

Мастер Кит

KIT-ATmega168PA-AU-MK890033 ₽
T-electron
Россия и страны СНГ
KIT-ATmega168PA-AU-MK890092 ₽
Элитан
Россия
KIT-ATMEGA168PA-AU-MK8900205 ₽
Триема
Россия
MK89001 009 ₽
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • А можно еще попробовать взять точное время от навигатора, во многие планшеты он уже встроен, либо прицепить внешний модуль. При этом не надо будет заботиться даже о начальной установке времени и даты.