自動化システムとKNX標準に精通していない場合は、Googleまたは公式サイトから必要な情報を入手できます。 この標準を使用すると、多くのことが明らかになります。おそらく、私と同じように、IPルーターを経由せずにKNX物理バスにアクセスする方法の問題に長い間興味を持っています。
次に、WeinzierlのRaspberry PiとKNX BAOS 838 kBerryモジュールを使用して、この問題を自分で解決した方法を示します。
やる気
KNX標準は、中央のPLCコントローラーがなくても機能する分散システムです。 分散化は信頼性を提供しますが、システムにPLCがないため、必要な柔軟性が失われます。 さまざまなIPゲートウェイを使用し、サーバーからUPD経由で通信できますが、バスへの直接アクセスの方が信頼性が高いため、このソリューションは検討しませんでした。
既存のソリューション
市場では、この問題の解決策を見つけることができますが、そのうちの次のものと密接に連携しました。
Loxoneミニサーバー
- 価格:〜600ユーロ
- さらに、独自のバス、幅広いデバイス。
- さらに、シンプルなコンフィギュレーター、ブロック単位のプログラミングロジック、優れたドキュメント。
- マイナス:高水準言語でプログラムする方法はありません。 組み込みのPicoCインタープリターがありますが、たとえば、クラウドへのアクセスを実装するのは問題です。
UMC用のiRidiumサーバー
- 価格:推奨小売価格は119000 rub、または1700ユーロです。
- さらに、KNXに加えて、多数の自動化システムのサポート。
- プラス:JavaScriptサポート。
- マイナス:プロジェクトファイルはzipアーカイブであり、編集が複雑になります。 すなわち スクリプトを編集するには、iRidium Studioに組み込みのスクリプトエディターを使用する必要があります。これには、通常のIDE /エディターの魅力がなく、プロジェクトをアンパック/ビルドする方法を考え出す必要があります。
- マイナス:JavaScriptエンジン。 たとえば、IR.SetTimeout / IR.SetIntervalではなく、おなじみのsetTimeout / setIntervalはありません。 nodejsとの互換性はありません。
- マイナス:安定性、頻繁な再起動。
EVIKA LogicMachine
- 価格:〜3000ユーロ。
- さらに、KNX TP / UARTに加えて、ボードには、構成に応じてRS-485、RS-232、その他のインターフェイスがあります。
- プラス:lua言語、cronスケジュールなど。
いくつかのソリューションは優れていますが、価格は反発的です。さらに、プログラミングの柔軟性を高めたいと思います。
解決策
この問題は、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 | ... . .
通信スキーム:
- アプリケーション(クライアント)がリセット要求を送信します。
- BAOS 838(サーバー)は確認応答を送信します。
- クライアントは最初の要求(たとえば、GetDatapointDescription.Req)を送信します。 奇数フレーム。
- サーバーはリクエストを受信し、確認応答を送信します。
- サーバーは、要求に対する応答を送信します。
- クライアントは確認応答を送信します。
....
接続
モジュールは、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パッケージの機能を使用する権利があります。 まだまだ多くの作業がありますが、順調なスタートが切れており、これを継続して喜んで動機付けています。
参照資料
- Githubリポジトリ
- KNX BAOSモジュール838 kBerry 。 リンクを使用して、情報を確認し、ETSのアプリケーションをダウンロードします。
- プロトコルの説明
- Raspberry Piの公式インストールドキュメント