この記事は The Qt Blog の QtKNX updates for 5.11 を翻訳したものです。
執筆: Andrew O'Doherty, 2018年05月18日
以前 KNX の対応 についてお知らせをして以降しばらく間が空いてしまいましたが、5.11 のリリースに合わせてアップデートを行う QtKNX の内容を簡単に紹介したいと思います。
今回のアップデートの焦点の一つは Qt KNX のオブジェクトの走査と構築をより直感的に改善することでした。KNXnet/IP フレームで必要となる数多くの仕様に対応するために、プロキシパターンを導入しました。例えば、KNXnet/IP の接続要求のフレームで実行される情報は QKnxNetIpConnectRequestProxy クラスを利用して得ることができます。
以下のサンプルコードでは、KNXnet/IP のサーバー側が接続要求のフレームを受信する際にこのクラスを使っています。
QKnxNetIpFrame frame = //...;
QKnxNetIpConnectRequestProxy request(frame);
if (!request.isValid())
return;auto ctrlEndpoint = request.controlEndpoint();
auto dataEndpoint = request.dataEndpoint();
auto cri = request.requestInformation();
このフレームはいくつものフィールドを持つ構造のため、コンストラクタに渡すパラメーターの順序を正確に覚える必要がある設計では使いづらくなります。これを簡単にするために、ビルダーパターンを採用しました。これによりオブジェクトの生成がカプセル化され、柔軟に使えるようになりました。
QKnxNetIpConnectRequestProxy のコンストラクタの代わりに QKnxNetIpConnectRequestProxy::builder() を利用することで以下のようにコードがすっきりとします。
auto frame = QKnxNetIpConnectRequestProxy::builder()
.setControlEndpoint(hpai)
.setDataEndpoint(hpai)
.create();
このプロキシとビルダーパターンはほぼすべての QtKNX のクラスで採用されています。
もう一つの新機能は ETS KNX プロジェクトファイルのサポートです。特に、グループアドレスと関連のデータポイントタイプ(DPT)に対応しました。KNX の世界に馴染みのない方もいるかと思いますが、ETS は Engineering Tool Software の頭文字をとったもので、KNX のインストールのデザインとコミッショニングのためのツールになります。
以下のコードは、ETS KNX プロジェクトファイルをパースする機能を使うサンプルです。
QKnxGroupAddressInfos infos(projFilePath);
infos.parse();
次に、パースに問題がなかったことを確認します。
if (infos.status() != QKnxGroupAddressInfos::Status::NoError)
return;
最後に、パースした情報を展開します。
for (const auto &projId: infos.projectIds()) {
auto installations = infos.installations(projId);
// ...
for (const QString &installation: installations) {
for (const QKnxGroupAddressInfo &addInfo: groupAddresses) {
if (!addInfo.isValid())
return;
//...
}
}
}
この他にも、ドキュメンテーションの大幅な改善やその他の更新もしました。QtKNX 5.11 のリリースをお楽しみに。フィードバックもお待ちしています!