Qtブログ(日本語)

あなたの想いを KNX プロトコルに載せる、スマートホーム用のライブラリ QtKnx について

作成者: 鈴木 佑|Aug 17, 2017 1:37:14 AM

この記事は The Qt BlogIntroducing QtKnx, the smart home library that translates your wishes into KNX protocol. を翻訳したものです。
執筆: Lucie Gérard, 2017年8月14日

QtKnx は Qt ユーザーのみなさんをホームオートメーションの世界へお連れします。

マルチプラットフォームでエレガントでフレキシブルなスマートホーム向けのソフトウェアが簡単に作れるようになりました。

必要なものは新たに開発された QtKnx ライブラリと、Qt の既存の機能だけです。

KNX はスマートホームとビル管理プロトコルのヨーロッパのリーダーで(https://www.knx.org)、PC 向けのソフトウェアでプログラミングやインストールが可能です。QtKnx ライブラリはオープンソースと商用のオプションでお使いいただけます。

まずはじめに、QtKnx では KNX サーバーを探索する KNX のクライアントの実装と、サーバーへのインストールの制御と管理が可能です。それでは実際の作業を見てみましょう。

テストケース

(下記の写真の)ボードとサーバー用意し、QtKnx の機能を使って KNX の小さなインストールを試してみます。サーバーはイントラネット内にあるものを使います。

探索

以下が QtKnx ライブラリでサーバーを探索する方法です:

  • 探索用のエージェントオブジェクトの取得(QKnxNetIpServerDiscoveryAgent agent)
  • エージェントの設定(任意)
  • エージェントに探索開始を指示(agent.start())
  • エージェントに見つけたサーバーと、サーバーが提供するサービスを教えてもらう(agent.discoveredServers())
    QKnxNetIpServerDiscoveryAgent agent;
//To have the server's response sent only to the provided local IP address as opposed to the multicast one.
agent.setResponseType(QKnxNetIpServerDiscoveryAgent::ResponseType::Unicast);
//The local IP address the server's response shall be sent to.
agent.setLocalAddress(QHostAddress("192.168.1.1"));
agent.start();
const auto servers = agent.discoveredServers();
...
for (auto server : servers) {
const auto serverAddress = server.controlEndpointAddress();
const auto serverPort = server.controlEndpointPort();
...
const auto serverServices = server.services();
for (auto it = services.constBegin(); it != services.constEnd(); ++it) {
qInfo().noquote() << QString::fromLatin1(" KNXnet/IP %1, Version: %2")
.arg(familieToString(it.key())).arg(it.value());
}
}

私たちはファイアーウォールの中で仕事をしているので、イントラネットの中にあるサーバーのみが見つかっています。以下が上記のコードで取得できたものの一覧です:

1 server(s) found on the network.
Server: KNX IP BAOS 777
Individual address: 1.2.2
Server control endpoint: 10.9.78.35:3671
Supported services:
KNXnet/IP Core, Version: 1
KNXnet/IP Device Management, Version: 2
KNXnet/IP Tunnel, Version: 1

KNX のインストールへ接続(例えばトンネルサービスを使用)

探索エージェントによるサーバーのコントロールエンドポイントアドレスとポートの取得が終わると、サーバーの背後にいるデバイスへのアクセスのための接続を確立することができます。トンネル接続により、電気をつけて、消してなどの指示のためのシンプルなパッケージを送ることが可能になります。

このトンネル接続を開通させるには:

  • トンネル接続オブジェクトを生成(QKnxNetIpTunnelConnection tunnel)
  • ローカル IP アドレスの設定。これはサーバーに送られ、返信用に利用されます。
  • サーバーのコントロールエンドポイントアドレスとポートに接続(tunnel.connectToHost(serverIpAddress, serverPort))
  • 電気の点灯、消灯はこのトンネルを利用し、手順をサーバーの後ろにいる KNX デバイスに対して送信します(tunnel.sendTunnelFrame(frame))。制御コマンドは Cemi フレームにカプセル化されます。フレーム自動生成の機能も近いうちに対応する予定です。
  • そして最後に、サーバーとの接続を遮断します(tunnel.disconnectFromHost())
    const auto servers = agent.discoveredServers();
QHostAddress serverIpAddress = servers[0].controlEndpointAddress();
quint16 serverPort = servers[0].controlEndpointPort();

QKnxNetIpTunnelConnection tunnel;
tunnel.setLocalAddress(QHostAddress("192.168.1.1"));
// Connecting to the previously discovered server
tunnel.connectToHost(serverIpAddress, serverPort);
QKnxCemiFrame frame = ... ;
tunnel.sendTunnelFrame(frame);
tunnel.disconnectFromHost();

UI のサンプル

もちろん QtKnx は Qt の一部なので、この機能を UI に組み込むのはとても簡単です。下記の画像は私たちが作成したサンプルの UI で、Qt Creator での見た目になります。

間もなく提供できるもの:KNX のクライアント実装に必要なすべての基本機能で、インストレーションを簡単に制御、管理できます。KNX プロトコルや高レベルのパッケージ形式の事前知識がなくても実装が可能です。

今後提供予定のもの:KNX サーバーの構築機能と、インストレーションのプログラムを Qt で書けるようにする機能。

この記事を読んで実際に試してみたくなった方は、お問い合わせからプレリリース版を入手してください。

オートメーション分野への弊社の取り組みについては こちらこちらのブログ記事 もご覧ください。