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" в файле конфигурации. Синтаксис:

  1. Strategies {  
  2.     <strategyname1> : "<cronexpression1>"  
  3.     <strategyname2> : "<cronexpression2>"  
  4.     ...  
  5.       
  6.     default = <strategynamex>, <strategynamey>  
  7. }  


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

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

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

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


где <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:

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

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

  1. // persistence strategies have a name and a definition and are referred to in the "Items" section  
  2. Strategies {  
  3.  // for rrd charts, we need a cron strategy  
  4.  everyMinute : "0 * * * * ?"  
  5. }  
  6.   
  7. Items {  
  8.  // let's only store temperature values in rrd  
  9.  PersistTemp* : strategy = everyMinute, restoreOnStartup  
  10. }  


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

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

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

  1. Group item=Hall label="Зал" icon="office"  
  2.    {  
  3.    Frame {  
  4.          Text item=Temperature_Hall  
  5.          Chart item=Temperature_Hall period=D refresh=10000  
  6.          Chart item=Temperature_Hall period=W refresh=10000  
  7.          }  
  8.    }  


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

  1. # apt-get install ttf-bitstream-vera ttf-dejavu ttf-liberation ttf-linux-libertine xfonts-terminus ttf-inconsolata  
  2. # /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 всегда.

      Удалить