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

в 0:29, , рубрики: baos, DIY, IoT, javascript, knx, node.js, nodejs, Программирование, умный дом

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

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

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

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

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

На данный момент все исходники проекта находятся по адресу https://github.com/bobaos

Структура

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

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

Автор: bobalus

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js