Pull to refresh

Bobaos — KNX TP/UART, Raspberry Pi и Unix Domain Socket

Reading time4 min
Views3.1K

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



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

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


Репозиторий на 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, уведомляющего о событиях в вашем доме :)


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

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+11
Comments2

Articles