- PVSM.RU - https://www.pvsm.ru -
В первой статье [1] я рассказал о цели, сделал небольшое описание проекта. В данной публикации я расскажу о текущем положении дел и развитии проекта.
История не повторяется, история улучшается.
Цитата с пачки табака. Далее я показажу, что улучшилось за четыре месяца работы над проектом.
На данный момент все исходники проекта находятся по адресу https://github.com/bobaos [2]
Так как серийный порт держит только одно соединение, было принято решение создать сервис bdsd.sock [3]. Сервис держит соединение по серийному порту с модулем Weinzierl KNX BAOS 838 kBerry с одной стороны, с другой — слушает UNIX сокет по адресу $XDG_RUNTIME_DIR/bdsd.sock. Клиенты общаются с сокетом посредством протокола BDSM(Bobaos Datapoint Sdk Message). Описание [4].
Сервис служит для того, чтобы была возможность подключиться одновременно с нескольких клиентов. Допустим, необходимо запустить 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 реализован на промисах, описание доступно на странице репозитория [5].
Клиентских библиотек для других языков программирования нету, но, т.к. проект open-source, возможность написать есть и приветствуется. Описание протокола [4].
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 [6]. Использую я его на каждом объекте для отладки. Задавать, читать, получать значения из шины 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, уведомляющего о событиях в вашем доме :)
Впереди интересная тропа для проекта и я буду держать вас в курсе хода. До следующих публикаций.
Автор: bobalus
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/278760
Ссылки в тексте:
[1] первой статье: https://habr.com/post/346680/
[2] https://github.com/bobaos: https://github.com/bobaos
[3] bdsd.sock: https://github.com/bobaos/bdsd.sock
[4] Описание: https://github.com/bobaos/bdsd.sock/blob/master/PROTOCOL.md
[5] странице репозитория: https://github.com/bobaos/bdsd.client
[6] bdsd-cli: https://github.com/bobaos/bdsd-cli
[7] Источник: https://habr.com/post/354246/?utm_campaign=354246
Нажмите здесь для печати.