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