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