# Voldeno Studio — 抽象ブロックと実装
同じ役割を果たしながら、通信方法だけが異なる機器があります。どのエアコンにも電源、運転モード、目標温度、ファン速度がありますが、ある機種はローカルネットワーク上の HTTP でコマンドを受け付け、別の機種は Modbus、さらに別の機種は赤外線のみで操作します。Voldeno はこの2つの役割を2つのブロックに分けます。
- 抽象ブロック は、同じ種類のすべての機器に共通するロジックを持ちます。入力と出力があり、他の Logic Block と同じようにプログラムの残りの部分と接続します。
- 実装ブロック は、特定の機器または機器ファミリーとその通信方法を知っています。独自の入力や出力はなく、抽象ブロックに接続された状態でのみ動作します。
これにより、自動化プログラムは機器のメーカーに依存しなくなります。エアコンを別のモデルに交換するときは実装ブロックを入れ替えるだけで、リンク、スケジュール、モバイルアプリのウィジェットはそのまま残ります。
# 仕組み
┌──────────────────────────────┐
サーモスタット ───▶│ Air conditioner │──────▶ 可視化
スケジュール ─────▶│ (抽象ブロック) │──────▶ 故障アラーム
│ 入力、出力、ロジック │
└──────────────┬───────────────┘
コマンド │ ▲ 読み取り値
▼ │
┌──────────────────────────────┐
│ Daikin BRP069 │◀─────▶ エアコン
│ (実装ブロック) │ LAN ローカルネットワーク上
└──────────────────────────────┘
- 抽象ブロックは入力で信号を受け取り、設定された制限を適用し、いつ機器にコマンドを送り、いつ状態を読み取るかを決めます。
- 通信そのものは接続された実装ブロックに任せ、実装ブロックがコマンドを機器のプロトコルに変換します。
- 機器が応答すると、実装ブロックが読み取り値を返し、抽象ブロックがそれを出力に公開します。
どちらのブロックも Hub 上でローカルに動作します。機器との通信にメーカーのクラウドやインターネット接続は不要で、Hub がローカルネットワーク上の機器に到達できれば十分です。
# Voldeno Studio で実装を接続する
- ロジックエディタで、他の Logic Block と同じように抽象ブロックをプログラムに追加します。例: Air conditioner。抽象ブロックはヘッダーの紫色の A バッジで見分けられます。
- 抽象ブロックの下に + の付いた 実装ソケット が表示されます。これをクリックします(ツールチップ:「実装ブロックを接続」)。
- このブロックに適合する実装だけに絞り込まれたブロック一覧が開きます。お使いの機器に合うものを選びます。
- 実装ブロックが抽象ブロックのすぐ下に配置されて接続され、ソケットは消えます。実装ブロックを選択し、サイドパネルの設定セクションで設定値を入力します。例えば Address フィールドに機器のネットワークアドレスを入力します。
- プログラムを Hub にデプロイします。
覚えておきたいルール:
- 1つの抽象ブロックに接続できる実装は1つです。 実装を接続するとソケットは消え、実装を削除すると再び表示されます。
- 実装は、それが実装する抽象ブロックなしには存在できません。 独立したブロックとしてキャンバスに配置することはできません。まず実装対象の抽象ブロックを追加し、そのソケットから実装を接続してください。実装はブロック検索に表示されますが、そこから直接追加することはできません。
- 実装は自分のブロックに追従します。 キャンバス上で一緒に移動し、抽象ブロックを削除すると接続された実装も削除されます。
- 機器が変われば実装も変わります。 現在の実装ブロックを削除し、ソケットから新しい実装を接続します。抽象ブロックとプログラムの他の部分とのリンクはそのまま残ります。
# どの設定がどこにあるか
2つのブロックはそれぞれ独自の設定を持ち、互いの設定は参照できません。
| ブロック | 設定する内容 | エアコンの例 |
|---|---|---|
| 抽象 | 機器に依存しない動作 | 目標温度の範囲、状態の更新間隔 |
| 実装 | 特定の機器への到達方法 | ローカルネットワーク上の Wi-Fi アダプターのアドレス |
ある設定をどこで探せばよいか迷ったら、機器を別のメーカーに交換したときにその設定が変わるかどうかを考えてください。変わるなら、それは実装に属します。
# モバイルアプリに表示される内容
Voldeno Mobile アプリで機器がどのように表示されるかは、抽象ブロックが決めます。アプリで公開すると、入力は操作要素 (電源、運転モード、目標温度など) に、出力は表示値 (室温や故障表示など) になります。実装ブロックには入力も出力もないため、アプリにはまったく表示されません。
例としてエアコンブロック (vldn/air_conditioner) を見てみましょう。アプリはこのブロックを認識し、専用の画面を表示します。上部に室温 (出力 room_temp)、その下に電源スイッチ (power) と目標温度 (target_temp) が並びます。ユーザーが温度を設定できる範囲は、抽象ブロックの設定 (min_target_temp と max_target_temp) から取得されます。運転モード (mode)、風量 (fan_speed)、ルーバーの位置 (swing_v、swing_h) は別の画面で選択し、選べる項目はブロックに記載された入力値に対応しています。
そのため、同じ種類の機器はメーカーに関係なくアプリ上で同じように表示され、実装を入れ替えてもユーザーが見て操作する内容は何も変わりません。
# 機器の状態と故障
実装が機器の状態を読み戻せる場合、抽象ブロックは機器が実際に報告した内容を出力に公開します。そのため、メーカーのリモコンで行った変更も次回の更新後に Voldeno に反映されます。機器が報告しない値は、抽象ブロックが指令した値のまま公開されます。
通信の問題は抽象ブロックの故障出力に現れるため、例えば通知を送るなど、プログラム内で対処できます。コードの意味は、各ブロックとその実装のドキュメントに記載されています。
実装が接続されていない抽象ブロックもデプロイできますが、機器には何も送信されず、出力には入力で設定された値が表示されるだけです。デプロイ前に、すべての抽象ブロックのソケットが埋まっていることを確認してください。
ヒント: ネットワーク実装は、設定されたアドレスで機器に接続します。再起動後にアドレスが変わらないよう、ルーターでそのアドレスを機器用に予約してください(DHCP 予約)。
# 利用可能な抽象ブロック
抽象ブロックとその実装の最新の一覧は、Logic Block の概要の「抽象ブロック」セクション にあります。各ブロックの実装は、そのブロックのドキュメントの「実装ブロック」セクションにも記載されています。
# 次のステップ
- Logic Block — 概要 — Voldeno で利用できるすべてのブロック
- Voldeno Studio でゼロからロジックを定義する方法 — ロジックエディタの基本