Bobaos-Raspberry Piを使用したKNX TP / UARTバスアクセス

自動化システムとKNX標準に精通していない場合は、Googleまたは公式サイトから必要な情報を入手できます。 この標準を使用すると、多くのことが明らかになります。おそらく、私と同じように、IPルーターを経由せずにKNX物理バスにアクセスする方法の問題に長い間興味を持っています。







次に、WeinzierlのRaspberry PiとKNX BAOS 838 kBerryモジュールを使用して、この問題を自分で解決した方法を示します。













やる気



KNX標準は、中央のPLCコントローラーがなくても機能する分散システムです。 分散化は信頼性を提供しますが、システムにPLCがないため、必要な柔軟性が失われます。 さまざまなIPゲートウェイを使用し、サーバーからUPD経由で通信できますが、バスへの直接アクセスの方が信頼性が高いため、このソリューションは検討しませんでした。







既存のソリューション



市場では、この問題の解決策を見つけることができますが、そのうちの次のものと密接に連携しました。







Loxoneミニサーバー





UMC用のiRidiumサーバー





EVIKA LogicMachine





いくつかのソリューションは優れていますが、価格は反発的です。さらに、プログラミングの柔軟性を高めたいと思います。







解決策



この問題は、Raspberry PiとWeinzierl KNX BAOS Module 838 kBerryを使用して解決されました。

モジュールのコストは約70ユーロで、合計でRaspberry Pi +電源を使用すると、DINレールのハウジングは約150ユーロになります。







ランタイムとして、nodejsが使用されます。依存関係のUARTと通信するための「シリアルポート」モジュール。







通信プロトコルの簡単な説明

このアプリケーションは、シリアルポートを介してBAOS 838モジュールに接続され、ObjectServerプロトコルを介して通信します。ObjectServerプロトコルの説明については、記事の最後にあるリンクを参照してください。







データフレームは、FT1.2プロトコルで次のとおりです。







|0x68|L|L|0x68|CR|data|C|0x16|  L -   data +1    CR -  ,  0x73  , 0x53   , C -  = (   +  ) mod 256
      
      





リセット要求、リセット表示、確認応答フレームなど、一定の長さのフレームもあります。







接続が開かれるとリセット要求が送信され、モジュールがリセットされるとリセット指示がbaos 838モジュールからRaspberry Piに送信され、データを受信すると確認応答が各側から送信されます。







データデータは次のフィールドで構成されます。







 |  |  |  | MainService | 1 |  .  0xF0 | SubService | 1 | .   : , , . | StartItem | 2 | ID   | NumberOfItems | 2 |    ...      .       .
      
      





通信スキーム:







  1. アプリケーション(クライアント)がリセット要求を送信します。
  2. BAOS 838(サーバー)は確認応答を送信します。
  3. クライアントは最初の要求(たとえば、GetDatapointDescription.Req)を送信します。 奇数フレーム。
  4. サーバーはリクエストを受信し、確認応答を送信します。
  5. サーバーは、要求に対する応答を送信します。
  6. クライアントは確認応答を送信します。

    ....


接続



モジュールは、Raspberry PiボードのGPIOピンに接続されています。詳細については、記事の最後にあるリンクを参照してください。







Ets



KNXデバイスと同様に、BAOS 838モジュールはETSを介して構成されます。 この場合のアプリケーションは「KNX BAOS 830」を使用しており、メーカーの公式ウェブサイトからダウンロードできます。 デバイスは、最大1000個のマルチキャストアドレスをサポートします。







Raspberry Piを構成する



まず、raspbian-stretch-liteをインストールし、sshアクセスを構成します。







次に、UARTインターフェイスを構成します。 Raspberry Pi 3の場合:







 sudo sh -c "echo dtoverlay=pi3-miniuart-bt >>/boot/config.txt"
      
      





/boot/cmdline.txtからエントリconsole = serial0,115200を削除します







ユーザーをダイヤルアウトグループに追加します。







 sudo usermod -a -G dialout YOURUSERNAME
      
      





再起動







 reboot
      
      





nodejs、gitをインストールします。







 curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get install -y nodejs git
      
      





準備が完了したら、プロジェクトに移ります。







ボバオクリ



テストのために、コマンドラインにシンプルなインターフェースを使用できます。 インストール:







 sudo npm install -g bobaos-cli
      
      





以下を開始します。







 % bobaos-cli bobaos> help Commands: help [command...] Provides help for a given command. exit Exits application. open [options] Open serial port getDatapointDescription [options] GetDatapointDescription.Req service setDatapointValue [options] SetDatapointValue.Req service with command "set and send to bus" readDatapointFromBus [options] SetDatapointValue.Req service with command "read via bus" getDatapointValue [options] GetDatapointValue.Req service getParameterByte [options] GetParameterByte.Req service
      
      





次に、openコマンドでポートを開きます。 デフォルトでは、デバイス/ dev / ttyAMA0との接続が開かれます。システムに異なるインターフェースがある場合は、-p、--portオプションを使用します。







さらに、構成されたデータポイントに関する情報を取得できます。







 bobaos> getDatapointDescription -s 1 -n 10 { service: 'GetDatapointDescription.Res', direction: 'response', error: false, start: 1, number: 10, payload: [ { id: 1, valueType: 8, configFlags: 95, dpt: 'dpt9' }, { id: 2, valueType: 7, configFlags: 87, dpt: 'dpt5' }, { id: 3, valueType: 7, configFlags: 87, dpt: 'dpt5' }, { id: 4, valueType: 7, configFlags: 87, dpt: 'dpt5' }, { id: 5, valueType: 7, configFlags: 87, dpt: 'dpt5' }, { id: 6, valueType: 0, configFlags: 95, dpt: 'dpt1' }, { id: 7, valueType: 0, configFlags: 95, dpt: 'dpt1' }, { id: 8, valueType: 0, configFlags: 87, dpt: 'dpt1' }, { id: 9, valueType: 0, configFlags: 87, dpt: 'dpt1' }, { id: 10, valueType: 14, configFlags: 87, dpt: 'dpt16' } ] } bobaos>
      
      





私の場合、最初のものは温度センサーであり、次にいくつかのシングルバイト値、いくつかのシングルビット値、およびdpt16文字列値です。







値を取得します。







 bobaos> getDatapointValue -s 1 -n 10 { service: 'GetDatapointValue.Res', direction: 'response', error: false, start: 1, number: 10, payload: [ { id: 1, state: 16, length: 2, value: <Buffer 0c bf> }, { id: 2, state: 0, length: 1, value: <Buffer 00> }, { id: 3, state: 0, length: 1, value: <Buffer 00> }, { id: 4, state: 0, length: 1, value: <Buffer 00> }, { id: 5, state: 0, length: 1, value: <Buffer 00> }, { id: 6, state: 0, length: 1, value: <Buffer 00> }, { id: 7, state: 0, length: 1, value: <Buffer 00> }, { id: 8, state: 0, length: 1, value: <Buffer 00> }, { id: 9, state: 0, length: 1, value: <Buffer 00> }, { id: 10, state: 0, length: 14, value: <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00> } ] } bobaos>
      
      





値は未変換の形式で返されます;変換には、dpt1からdpt18までの型をサポートするknx-dpts-baosライブラリを使用できます。







値を設定します。







 bobaos> setDatapointValue -s 2 -v 128 -t dpt5 { service: 'SetDatapointValue.Res', direction: 'response', error: false, start: 2, number: 0, payload: null } bobaos> getDatapointValue -s 2 { service: 'GetDatapointValue.Res', direction: 'response', error: false, start: 2, number: 1, payload: [ { id: 2, state: 16, length: 1, value: <Buffer 80> } ] } bobaos>
      
      





bobaos-cliを使用すると、バスからデータをすばやくテスト、インストール、読み取りできます。







アプリケーションの使用



npmパッケージをインストールします。







 npm install --save bobaos
      
      





スクリプトに追加します。







  const Baos = require('bobaos'); const app = new Baos({serialPort: {device: '/dev/ttyAMA0'}, debug: false}); // send requests after successful initial reset app.on('open', () => { app .getDatapointDescription(1, 10) .getParameterByte(1, 10) .readDatapointFromBus(1, 2) // good .readDatapointFromBus(1, 10) // error! .getDatapointValue(1, 10) .setDatapointValue(2, Buffer.alloc(1, 0xc0)) .getDatapointValue(2); }); // listen to incoming events and responses app.on('service', console.log);
      
      





出力は次のようになります。







 { service: 'GetParameterByte.Res', error: false, start: 1, number: 10, payload: <Buffer 01 03 05 07 09 0b 0a 00 00 00> } { service: 'SetDatapointValue.Res', error: false, start: 1, number: 0, payload: null } { service: 'GetDatapointValue.Res', error: false, start: 1, number: 1, payload: [ { id: 1, state: 4, length: 2, value: <Buffer 0c fb> } ] } .... ....
      
      





これで、自由に実験し、スクリプトを作成し、nodejs、npmパッケージの機能を使用する権利があります。 まだまだ多くの作業がありますが、順調なスタートが切れており、これを継続して喜んで動機付けています。







参照資料



  1. Githubリポジトリ
  2. KNX BAOSモジュール838 kBerry 。 リンクを使用して、情報を確認し、ETSのアプリケーションをダウンロードします。
  3. プロトコルの説明
  4. Raspberry Piの公式インストールドキュメント



All Articles