Хабрахабр

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

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

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

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

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

На данный момент все исходники проекта находятся по адресу.

Структура

Сервис держит соединение по серийному порту с модулем Weinzierl KNX BAOS 838 kBerry с одной стороны, с другой — слушает UNIX сокет по адресу $XDG_RUNTIME_DIR/bdsd.sock. Так как серийный порт держит только одно соединение, было принято решение создать сервис bdsd.sock. Описание. Клиенты общаются с сокетом посредством протокола BDSM(Bobaos Datapoint Sdk Message).

Серверная часть: bdsd.sock

Допустим, необходимо запустить CLI для отладки и, в то же самое время, другой сервис, для примера — плагин для поддержки socket.io или mqtt. Сервис служит для того, чтобы была возможность подключиться одновременно с нескольких клиентов.

Установка:

$ sudo npm install -g bdsd.sock --unsafe-perm

Запуск:

$ bdsd.sock

Инструкция, а также service файл доступны в репозитории. Для автоматического старта при запуске системы можно использовать возможности systemd.

Инструкция по настройке есть в предыдущей публикации. Естественно, чтобы сервис работал, необходимо настроить доступ к UART Raspberry Pi.

При запуске сервиса bdsd.sock опрашивает модуль BAOS о хранимых датапонтах(GetDatapointDescription. Помимо IPC добавилась поддержка типов данных. Для клиента это значит что не надо вручную преобразовывать набор байт, bdsd.sock делает эту работу сам. Req) и далее хранит все значения у себя, в том числе и тип(DPT1, DPT5, и т.д.).

Было:

bobaos> setDatapointValue -s 2 -v 128 -t dpt5

Стало:

bobaos> setValue -s 2 -v 128

Было:

bobaos> getDatapointValue -s 1
] }

Стало:

bobaos> getValue -s 1
{ id: 1, value: 22.2, raw: { type: 'Buffer', data: [ 12, 86 ] } }

Клиентская часть: bdsd.client

Доступен в npm. bdsd.client — клиентская библиотека для nodejs проектов.

Установка:

$ 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); }
});

Клиентский API реализован на промисах, описание доступно на странице репозитория. В данном примере мы инвертируем значение датапоинта 42 каждые 5 секунд.

проект 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, уведомляющего о событиях в вашем доме 🙂

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

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть