16 января 2014 г.

Сохранение данных OpenHAB. Графики

Отлично, температура у нас есть.

Кстати, теперь можно протестировать и android приложение, тут самая последняя версия. У меня на планшете заработало сразу, единственный момент, надо указывать не полный url, а вида http(s)://server:port/ , выбор sitemap происходит в самом приложении, а если он один, то и запускается сразу. К сожалению, работает на android только начиная с версии 4.0.3.

Переходим к теме. Для того чтобы заиметь график температуры ее надо сначала сохранить.

Изучаем документацию по Persistence (сохранение состояния) и rrd4j. Процитирую слова разработчика: "As said above, I would recommend rrd4j", тем не менее OpenHAB поддерживает больше число мест сохранения данных (db4o, sql и др.), которые могут работать одновременно. Для начала нам нужен org.openhab.persistence.rrd4j-1.3.1.jar в папке addons.

Конфигурация.

Для редактирования конфигурации советуют использовать openHAB Designer, так как там есть проверка и автодополнение синтаксиса. Основная идея файла конфигурации, сообщить OpenHAB, какие данные и когда сохранять. Для для того, чтобы определить "когда" сохранять данные используют слово "strategies" в файле конфигурации. Синтаксис:

Strategies {
    <strategyname1> : "<cronexpression1>"
    <strategyname2> : "<cronexpression2>"
    ...
    
    default = <strategynamex>, <strategynamey>
}


Следующие "стратегии" предварительно сконфигурированы, их можно не описывать, но можно прописать в default:

  • everyChange: сохранять состояние при его изменении
  • everyUpdate: сохранят состояние при его обновлении, даже если значение не изменилось
  • restoreOnStartup: если состояние не определено при запуске, последнее сохраненное значение будет загружено и элемент будет проинициализирован им. Это очень удобно для всех "виртуальных" устройств, которые не имеют связи с реальным железом. (например "Presence").

Структура описания элементов для сохранения.

Items {
    <itemlist1> [-> "<alias1>"] : [strategy = <strategy1>, <strategy2>, ...]
    <itemlist2> [-> "<alias2>"] : [strategy = <strategyX>, <strategyY>, ...]
    ...
}


где <itemlist> разделенный запятыми список следующих опций:
  • * - эта линия должна применяться для всех элементов в системе. Пример:
    // persist all items once a day and on every change and restore them from the db at startup      
    * : strategy = everyChange, everyDay, restoreOnStartup
  • <itemName> - одиночный элемент (его имя). Это может быть группа, но в таком случае сохранится только значение группы, не значения элементов.
  • <groupName>* - все члены группы будут сохранены, но не сама группа. если стратегия не предоставлена, используется стратегия по умолчанию, описанная в первой в используемой секции. Как опция, может быть предоставлен псевдоним, если сервис сохранения требует специального имени (например таблица в БД и т.п.).

Ну что же попробуем сохранить температуру. Создадим группу. Назовем ее PersistTemp. Добавляем в Items:

Group PersistTemp (All)
/* Indoor Temperatures */
Number Temperature_Hall "Температура [%.1f °C]" <temperature> (Hall, PersistTemp) { onewire="28.1A821E040000#temperature" }

Пишем rrd4j.persist (не забудьте про addons/org.openhab.persistence.rrd4j-1.3.1.jar ):

// persistence strategies have a name and a definition and are referred to in the "Items" section
Strategies {
 // for rrd charts, we need a cron strategy
 everyMinute : "0 * * * * ?"
}

Items {
 // let's only store temperature values in rrd
 PersistTemp* : strategy = everyMinute, restoreOnStartup
}


Обратите внимание, что крон тут не стандартный и начинается с секунд - подробнее здесь. Если все ок, смотрим директорию openHAB/etc/rrd4j/ . Там лежат файлы с данными.

Данные мы сохранили, а что делать с ними дальше? Изучаем демо, там есть график температуры.

Меняем sitemap. Группа в sitemap по умолчанию синхронизируется с элементами в группе в Items (довольно не очевидно и не очень понятно вначале, тем более в документации об этом не написано вроде). Теперь у нас группа в sitemap Hall будет состоять из Item и Chart, поэтому будет перезаписана правилами sitemap. В примере в демо такие "вручную описанные" блоки имеют вид "Text label="Widget Overview" icon="chart" {}". Но я оставил группу - и так работает, добавляем (пояснение по параметрам ниже):

Group item=Hall label="Зал" icon="office"
   {
   Frame {
         Text item=Temperature_Hall
         Chart item=Temperature_Hall period=D refresh=10000
         Chart item=Temperature_Hall period=W refresh=10000
         }
   }


Заходим и не работает график. Копируем url изображения и переходим на него в новой вкладке. Ошибка 500 Probable fatal error:No fonts found.

# apt-get install ttf-bitstream-vera ttf-dejavu ttf-liberation ttf-linux-libertine xfonts-terminus ttf-inconsolata
# /etc/init.d/openhab restart


Кстати, напоминаю, у меня OpenHAB и 1-wire сеть, которые работают на cubietruck.

Небольшая информация по графикам. Параметры, которые можно передавать:

w: ширина, опция, по умолчанию 480 пикселей
h: высота, опция, по умолчанию 240
period: время по оси X. Значения могут быть h,4h,8h,12h,D,3D,W,2W,M,2M,4M,Y - параметр опциональный, по умолчанию "D", то есть за последние 24 часа.
items: разделенные запятыми элементы (items).
или
groups: разделенные запятыми группы.


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

  1. Привет! А как Вы устанавливаете время для графиков? У меня оно сдвинуто к Гринвичу :-(

    ОтветитьУдалить
    Ответы
    1. 1.5 года прошло, уже многое поменялось наверное. Я сейчас не использую openhab - негде.
      Я думаю, если у вас сдвинуто время к Гринвичу, то вам надо где-то выставить часовой пояс. Я так понимаю, openhab берет его из java функции TimeZone.getDefault(), которая в свою очередь это значение из системы.

      Удалить
    2. Приветствую!
      А сеть 1-wire тоже "забросили"?

      Удалить
    3. пока да :(
      Если вопрос простой, то может и смогу чем-нибудь помочь.

      Удалить
  2. А в системе все нормально со временем :-(

    ОтветитьУдалить
    Ответы
    1. попробуйте сделать файл:
      timetest.java

      public class TimeTest
      {
      public static void main(String[] args)
      {
      System.out.println(java.util.TimeZone.getDefault());
      }
      }

      Потом

      $javac timetest.java
      $java TimeTest

      Все это от пользователя под которым запускается openHAB

      Удалить
  3. Спасибо!
    ... но графики теперь не знаю почему, без моего участия ушли от гринвича и пришли ... на час вперед :-) Без того, чем Вы помогли.
    Ладно, разберемся. Спасибо!!!

    ОтветитьУдалить
  4. Вопрос решился вот как: устанавливаем временную зону как в Москве (я живу в ней), но не московскую.

    ОтветитьУдалить
    Ответы
    1. Ааа, наверное это летнее (или зимнее) время, неплохо бы наверное систему обновить, чтобы была Москва +3 всегда.

      Удалить