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

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



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

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


    Репозиторий на 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, уведомляющего о событиях в вашем доме :)


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

    • +11
    • 2,1k
    • 2
    Поделиться публикацией

    Похожие публикации

    Комментарии 2

      0
      Это решает вопрос выбора системы умного дома.

      До этого рассматривал Z-Wave с RPi-щитом RaZberry. Но невозможность проводного подключения устройств и низкий лимит их количества меня убивали.

      А KNX отталкивал дороговизной хаба и отсутствием внятного API. К счастью, есть добрые люди на свете.
        0
        IP/USB шлюз вам потребуется все равно для настройки, равно как и ETS. Если есть знакомые, занимающиеся KNX, можно одолжить у них на время. ETS можно найти с кряком, естественно, для ознакомительных целей.
        Плюс в пользу KNX: в последнее время на рынке довольно много производителей, и систему можно собрать вполне бюджетно.

        Насчет API: есть интересные проекты для изучения: knxd, knx.js, и т.д… Официальное описание стека KNX доступно только для производителей, но в сети уже достаточно много информации и реализаций(тот же knx.js). bobaos в данном случае отличает то, что он общается с шиной посредством BAOS ObjectServer protocol. Также есть официальный BAOS SDK от Weinzierl.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое