В первой статье я рассказал о цели, сделал небольшое описание проекта. В данной публикации я расскажу о текущем положении дел и развитии проекта.



История не повторяется, история улучшается.

Цитата с пачки табака. Далее я показажу, что улучшилось за четыре месяца работы над проектом.


Репозиторий на github


На данный момент все исходники проекта находятся по адресу.


Структура


Так как серийный порт держит только одно соединение, было принято решение создать сервис bdsd.sock. Сервис держит соединение по серийному порту с модулем Weinzierl KNX BAOS 838 kBerry с одной стороны, с другой — слушает UNIX сокет по адресу $XDG_RUNTIME_DIR/bdsd.sock. Клиенты общаются с сокетом посредством протокола BDSM(Bobaos Datapoint Sdk Message). Описание.


Серверная часть: bdsd.sock


Сервис служит для того, чтобы была возможность подключиться одновременно с нескольких клиентов. Допустим, необходимо запустить CLI для отладки и, в то же самое время, другой сервис, для примера — плагин для поддержки socket.io или mqtt.


Установка:


$ sudo npm install -g bdsd.sock --unsafe-perm

Запуск:


$ bdsd.sock

Для автоматического старта при запуске системы можно использовать возможности systemd. Инструкция, а также service файл доступны в репозитории.


Естественно, чтобы сервис работал, необходимо настроить доступ к UART Raspberry Pi. Инструкция по настройке есть в предыдущей публикации.


Помимо IPC добавилась поддержка типов данных. При запуске сервиса bdsd.sock опрашивает модуль BAOS о хранимых датапонтах(GetDatapointDescription.Req) и далее хранит все значения у себя, в том числе и тип(DPT1, DPT5, и т.д.). Для клиента это значит что не надо вручную преобразовывать набор байт, bdsd.sock делает эту работу сам.


Было:


bobaos> setDatapointValue -s 2 -v 128 -t dpt5

Стало:


bobaos> setValue -s 2 -v 128

Было:


bobaos> getDatapointValue -s 1
{ service: 'GetDatapointValue.Res',
  direction: 'response',
  error: false,
  start: 1,
  number: 1,
  payload: [ { id: 1, state: 16, length: 2, value: <Buffer 0c 56> } ] }

Стало:


bobaos> getValue -s 1
{ id: 1, value: 22.2, raw: { type: 'Buffer', data: [ 12, 86 ] } }

Клиентская часть: bdsd.client


bdsd.client — клиентская библиотека для nodejs проектов. Доступен в npm.


Установка:


$ npm install --save bdsd.client

Пример:


let myClient = require('bdsd.client')();

let myInterval = null;
myClient.on('connect', _ => {
  console.log('connected to bdsd.sock');
  if (myInterval === null) {
    myInterval = setInterval(_ => {
      myClient
        .getValue(42)
        .then(payload => {
          return myClient
            .setValue(payload.id, !payload.value);
        })
        .catch(e => {
          console.log('an error occurred', e);
        });
    }, 5000);
  }
});

В данном примере мы инвертируем значение датапоинта 42 каждые 5 секунд. Клиентский API реализован на промисах, описание доступно на странице репозитория.


Клиентских библиотек для других языков программирования нету, но, т.к. проект open-source, возможность написать есть и приветствуется. Описание протокола.


Клиентская часть: bdsd-io


Socket.io интерфейс для взаимодействия с клиентами других машин, для примера, в локальной сети.


Установка:


$ sudo npm install -g bdsd-io --unsafe-perm
$ bdsd-io

Пример клиента:


const socket = require('socket.io-client')('http://<RPi ip address>:49199');
socket.on('connect', _ => {
  console.log('Connected to bobaos server!');
  socket.emit('get value', 1, function(err, payload) {
    if (err) {
      throw new Error(err)
    }
    console.log('Got datapoint 1 value: ', payload);
  });

  // регистрируем слушатель на события в шине
  socket.on('value', function(payload){
    console.log('got broadcasted value:', payload);
  });
})

bdsd-io поддерживает следующие методы:


  • 'get datapoints' — получить список всех датапоинтов
  • 'get description' — получить описание одного датапоинта
  • 'get value' — получить значение
  • 'set value' — установить значение
  • 'read value' — отправить запрос на чтение в шину KNX

Клиентская часть: bdsd-cli


На смену bobaos-cli пришел новый интерфейс коммандной строки bdsd-cli. Использую я его на каждом объекте для отладки. Задавать, читать, получать значения из шины KNX удобнее чем из ETS тем, что управление осуществляется через коммандную строку, что значительно повышает скорость работы.


Установка и использование:


$ sudo npm install -g bdsd-cli --unsafe-perm
$ bdsd-cli
connected
bobaos> setValue -s 999 -v 'Hello, friend'
{ id: 999 }
bobaos> getValue -s 999
{ id: 999,
  value: 'Hello, friend',
  raw:
   { type: 'Buffer',
     data: [ 72, 101, 108, 108, 111, 44, 32, 102, 114, 105, 101, 110, 100, 0 ] } }
bobaos> getDescription -s 999
{ id: 999,
  value:
   { id: 999,
     dpt: 'dpt16',
     flags:
      { priority: 'low',
        communication: true,
        read: false,
        write: true,
        readOnInit: false,
        transmit: true,
        update: false },
     length: 14 } }
broadcasted value: { id: 1, value: 22.3, raw: { type: 'Buffer', data: [ 12, 91 ] } }
bobaos> setProgrammingMode -v 1
Set programming mode: success
bobaos> setProgrammingMode -v 0

Список команд:


  • getDatapoints — получить все датапоинты
  • getDescription — описание одного объекта
  • getValue — получить значение одного объекта
  • setValue — установить значение объекта
  • readValue — запрос на чтение в шину KNX
  • setProgrammingMode — режим программирования. Позволит записать физический адрес из ETS, не нажимая кнопку физически.

Итог


С течением времени многие вещи улучшаются и развиваются. В том числе и bobaos-project, работа над которым в самом разгаре и идеи практического применения активно воплощаюся в жизнь. Как пример можно с полпинка поднять бота для telegram, уведомляющего о событиях в вашем доме :)


Впереди интересная тропа для проекта и я буду держать вас в курсе хода. До следующих публикаций.

Комментарии (2)


  1. lolmaus
    25.04.2018 13:31

    Это решает вопрос выбора системы умного дома.

    До этого рассматривал Z-Wave с RPi-щитом RaZberry. Но невозможность проводного подключения устройств и низкий лимит их количества меня убивали.

    А KNX отталкивал дороговизной хаба и отсутствием внятного API. К счастью, есть добрые люди на свете.


    1. bobalus Автор
      25.04.2018 15:10

      IP/USB шлюз вам потребуется все равно для настройки, равно как и ETS. Если есть знакомые, занимающиеся KNX, можно одолжить у них на время. ETS можно найти с кряком, естественно, для ознакомительных целей.
      Плюс в пользу KNX: в последнее время на рынке довольно много производителей, и систему можно собрать вполне бюджетно.

      Насчет API: есть интересные проекты для изучения: knxd, knx.js, и т.д… Официальное описание стека KNX доступно только для производителей, но в сети уже достаточно много информации и реализаций(тот же knx.js). bobaos в данном случае отличает то, что он общается с шиной посредством BAOS ObjectServer protocol. Также есть официальный BAOS SDK от Weinzierl.