このガイドでは、Dashboard 2.0の最も強力なウィジェットであるtemplateについて詳しく解説します。templateを使えば、Vue.jsとVuetifyを活用してカスタムウィジェットを自由に作成できます。
📌 このガイドで学べること:
📥 まずサンプルフローをインポートしましょう!
以下のサンプルフローには、このガイドで説明する全パターンの実例が含まれています。
先にインポートして、実際に動作を確認しながら読み進めると理解が深まります。
参照元:FlowFuse Dashboard 2.0 公式ドキュメント
templateは、Dashboard 2.0で完全にカスタマイズされたウィジェットを作成できる最も強力なノードです。 日常生活で例えると、「DIY工房」のようなものです。他のウィジェットが「既製品の家具」だとすれば、templateは「自分で設計図を描いて、好きな材料で好きな家具を作れる工房」です。
🔧 DIY工房に例えると:
標準ウィジェットにない独自のUIコンポーネントを作成
ダッシュボード全体や特定ページのスタイルをカスタマイズ
Chart.jsやD3.jsを使った高度なグラフ・可視化
外部JavaScriptライブラリを読み込んで活用
templateには4つの異なるタイプがあり、それぞれ用途が異なります。
| タイプ | スコープ | 用途 | Group設定 |
|---|---|---|---|
| ウィジェット (UI) | グループ内 | カスタムウィジェットの作成 | 必須 |
| CSS スコープCSS | グループ内 | 特定グループのスタイル変更 | 必須 |
| Page ページ (UI) | ページ全体 | ページ全体に表示するUI要素 | ページ選択 |
| Site サイト全体CSS | 全ページ | ダッシュボード全体のスタイル | ui-base選択 |
最も一般的なタイプで、カスタムウィジェットを作成します。指定したグループ内に表示されます。
特定のグループやウィジェットのスタイルをカスタマイズします。<style>タグのみを記述します。
ページ全体に表示されるUI要素を作成します。フッターやページ共通の要素に最適です。
ダッシュボード全体に適用されるCSSを定義します。テーマのカスタマイズに使用します。
| プロパティ | 説明 | デフォルト |
|---|---|---|
| Group | 表示するグループ(Widget/CSSタイプ時) | - |
| Page | 対象ページ(Pageタイプ時) | - |
| UI | 対象UI Base(Siteタイプ時) | - |
| Name | ノードの名前 | 空 |
| Scope | テンプレートスコープ(local/page/site) | local |
| Order | グループ内の表示順序 | 0 |
| Size (Width / Height) | ウィジェットの幅と高さ | 0 (自動) |
| Template | テンプレート本体(Vue.js SFC形式) | デフォルトテンプレート |
| Pass Through | 入力メッセージを出力にパススルー | true |
| Class | CSSクラス名 | 空 |
templateでは、Vue.jsのOptions APIを使用してコンポーネントを構築します。以下のプロパティがサポートされています。
| プロパティ | 説明 | 使用例 |
|---|---|---|
| data | コンポーネント内で使用するデータを定義する関数 | カウンター、状態管理 |
| methods | テンプレートやスクリプトから呼び出せる関数を定義 | ボタンクリック処理 |
| computed | 他の変数から計算される値を定義 | 合計値、フォーマット済み文字列 |
| watch | 変数の変更を監視して処理を実行 | msgの変更検知 |
| mounted | コンポーネントがロードされた時に実行 | 初期化処理 |
| unmounted | コンポーネントが削除される時に実行 | クリーンアップ処理 |
💡 Vue.js Options APIの基本構造:
| 変数 | 説明 | 使用例 |
|---|---|---|
msg |
Node-REDから受信した最新のメッセージ | {{ msg.payload }} |
this.$socket |
Socket.IO接続オブジェクト | カスタムイベントリスナー |
this.$route |
現在のルート情報(URLパラメータなど) | this.$route.query.param |
this.id |
ウィジェットのユニークID | ソケットイベント識別 |
| メソッド | 説明 | 使用例 |
|---|---|---|
this.send(msg) |
Node-REDフローにメッセージを送信 | this.send({ payload: "データ" }) |
this.submit() |
フォームデータをNode-REDに送信 | フォーム送信処理 |
方法1: watchでmsgを監視
方法2: Socket.IOイベントリスナー
⚠️ watchとSocket.IOの違い:
用途に応じて使い分けましょう。
templateでは、Vuetifyコンポーネントライブラリが標準で利用可能です。豊富な既製コンポーネントを使って、プロフェッショナルなUIを簡単に構築できます。
💡 Vuetifyコンポーネント一覧:
全コンポーネントは Vuetify公式ドキュメント で確認できます。
用途: シンプルなカスタムボタンでNode-REDにメッセージを送信
用途: Node-REDからのメッセージを受信して表示
用途: ユーザー入力を受け取り、Node-REDに送信
用途: 状態に応じた動的な表示切り替え
用途: Chart.jsを使ったカスタムグラフ
📝 課題:
Vuetifyのv-switchを使って、ON/OFFを切り替えるカスタムウィジェットを作成してください。
🎯 要求仕様:
📊 期待される出力:
msg.payload = truemsg.payload = falseui-templateの設定:
Vue.jsのポイント:
v-modelでスイッチの状態をデータにバインド@changeまたはwatchで状態変更を検知this.send()でメッセージ送信コード例:
📝 課題:
センサーデータ(温度・湿度)を受信して、カード形式でリアルタイム表示するウィジェットを作成してください。
🎯 要求仕様:
📊 入力データ形式:
Injectノードの設定:
Vue.jsのポイント:
computedで温度に応じた色を計算watchでmsg変更を監視Vuetifyアイコン例:
最終更新: {{ lastUpdate }}
\n📝 課題:
タスクの追加・削除・完了切り替えができるToDoリストウィジェットを作成してください。
🎯 要求仕様:
データ構造:
Vue.jsのポイント:
v-forでリスト表示v-checkboxで完了状態管理完了: {{ completedCount }} / {{ todos.length }}
\n📝 課題:
複数のデバイスの状態を表示し、各デバイスの制御ができるダッシュボードを作成してください。
🎯 要求仕様:
データ構造:
送信データ形式:
| 問題 | 原因 | 解決方法 |
|---|---|---|
| ウィジェットが表示されない | Group未設定またはエラー | Groupを設定し、ブラウザのコンソールでエラー確認 |
| メッセージが受信できない | watch設定ミスまたはプロパティ名誤り | watch: { msg(newMsg) {...} }の形式を確認 |
| send()が動作しない | thisの参照が失われている | アロー関数を使用するか、外側でconst self = thisを保存 |
| CSSが適用されない | scopedの影響または優先度不足 | !importantを追加またはscopedを外す |
| Vuetifyコンポーネントが動かない | v-model設定ミスまたはデータ未定義 | data()でv-modelに対応する変数を定義 |
| ページリロードで状態がリセット | 状態がブラウザ内のみ | resendOnRefresh: trueを設定しNode-REDから再送信 |
このガイドが役に立ちましたら、実際のプロジェクトで練習してみてください!
templateはDashboard 2.0の最も強力なウィジェットです。
参照元:FlowFuse Dashboard 2.0 公式ドキュメント