Bobaos — KNX TP/UART, Raspberry Pi и Unix Domain Socket
- четверг, 26 апреля 2018 г. в 00:21:51
В первой статье я рассказал о цели, сделал небольшое описание проекта. В данной публикации я расскажу о текущем положении дел и развитии проекта.
История не повторяется, история улучшается.
Цитата с пачки табака. Далее я показажу, что улучшилось за четыре месяца работы над проектом.
На данный момент все исходники проекта находятся по адресу.
Так как серийный порт держит только одно соединение, было принято решение создать сервис bdsd.sock. Сервис держит соединение по серийному порту с модулем Weinzierl KNX BAOS 838 kBerry с одной стороны, с другой — слушает UNIX сокет по адресу $XDG_RUNTIME_DIR/bdsd.sock. Клиенты общаются с сокетом посредством протокола BDSM(Bobaos Datapoint Sdk Message). Описание.
Сервис служит для того, чтобы была возможность подключиться одновременно с нескольких клиентов. Допустим, необходимо запустить 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 — клиентская библиотека для 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, возможность написать есть и приветствуется. Описание протокола.
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 поддерживает следующие методы:
На смену 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
Список команд:
С течением времени многие вещи улучшаются и развиваются. В том числе и bobaos-project, работа над которым в самом разгаре и идеи практического применения активно воплощаюся в жизнь. Как пример можно с полпинка поднять бота для telegram, уведомляющего о событиях в вашем доме :)
Впереди интересная тропа для проекта и я буду держать вас в курсе хода. До следующих публикаций.