🐷

ThingsBoard / 顧客向け汎用Dashboardの作成・管理

2025/02/06に公開

Overview

この記事で権限管理について述べました。Deviceを例に顧客ごとに顧客自身のDeviceしか見ることができないように権限設定しましたが、Dashboardはじめ他のEntityに関しても同じように顧客単位での権限管理ができます。

一方で、「テナントオーナーがDashboardを作成し複数の顧客に展開するが、各顧客は自身のDeviceしか見られない」ようにしたいケースがあると思います。例えば、装置XをCustomerAとCustomerBに提供していて、両Customerに同じDashboardを提供する場合です。

上述の記事の手法で、CustomerA/Bそれぞれに同じDashboardを個別に作って提供することもできますが、顧客の数がNになればN個の同じDashboardを作成することになり、そうなるとメンテナンスが大変になってきますし、ThingsBoard Cloudを使っていればDashboardの数の上限も気になってくるところです。

「テナントオーナーがDashboardを作成し複数の顧客に展開するが、各顧客は自身のDeviceしか見られない」を1つのDashboardで実現する方法を、本稿で示します。

前提

2つのCustomerと、各CustomerにDeviceをひとつずつ用意します。ここではCustomerAにdevice1を、CustomerBにdevice2を用意しました。

Dashboardの作成

まずは空のDashboardをひとつ用意して、CustomerA/Bの両顧客がこれを閲覧できるようにします。

Dashboardの作り方です。左メニューのDashboardsにアクセスし、右上の「+」ボタンで新規作成です。Titleに適当な名前を入力して「Add」で空のDashboardが作成されます。

Dashboardグループの作成

この記事で述べましたが、Entity(今回はDashboard)自体にユーザ権限を紐づけることはできず、Entity Group(今回はDashboard Group)を作成して、Group単位で権限を設定する必要がありました。今回もGroupでの設定が必要になるためDashboardグループを作成します。

Dashboardsの画面から上部のGroupsにアクセスし、同様に「+」ボタンからGroupを作成します。

DashboardグループのCustomerへの共有

作成したDashboardをCustomerに共有します。Dashboardグループで対象のDashboardの「Share」ボタンから共有設定ができます。共有するCustomerを選択して共有します。

設定が終わったらDashboardグループの「Permissions」タブで共有したCustomerの一覧が確認できます。

設定後、共有されたCustomerのユーザでログインし、Dashboards > Shared でさきほど作成したDashboardが確認できればOKです。

Dashboardの中身を作る

Dashboard自体の共有は完了したので、Dashboardの中身を作ります。改めてですが「各顧客は自身のDeviceしか見られない」ようにします。ここではDashboardに各顧客のDeviceの一覧を表示するようなDashboardを作ります。

さきほど作ったDashboardの編集画面に移り、Entities table widgetを追加します。Add widget > Entity widgetsにEntities table widgetがあります。

Entities tableを選択したら設定画面が開きます。
右上に Device or Entity alias を選択する部分があるので、Entity aliasを選択します。Deviceを選択すると特定の1つのDeviceを選択するしかできないのですが、Entity aliasを選択するとグループでの指定などによって複数Deviceを選択できるようになります。

以下の設定を行います。

  • Alias nameは適当なもの
  • Filter typeには「Entities by group name」を選択
  • Typeは「Device」を選択
  • Entity group nameには「All」を入力

Filter typeには「Entities by group name」と同じような名前のもの(Group entities、Entity group nameなど)があって紛らわしいですが、間違えないように。
ここでEntity group nameに「All」を指定しています。「Entities by group name」は「グループ名がここで入力したものとマッチしたグループ内のEntity」をすべて取得するオプションです。
各Customer配下に作成されたDeviceは必ず「All」のDeviceグループに紐づけられますが、この「All」はCustomerAのDeviceとCustomerBのDeviceで異なる「All」を指します。図解すると以下です。

ThingsBoard Cloud
├── Customer A
│   └── Device Group
│       └── All   ← Customer A の "All"
│           └── device1
├── Customer B
│   └── Device Group
│       └── All   ← Customer B の "All"
│           └── device2
└── ...

「Entities by group name」以外のオプションでは、CustomerAの"All"、もしくはCustomerBの"All"どちらか一方しか指定することはできません(おそらく)。

Entity aliasが設定できたら「Apply」で適用します。この段階でEntities tableには何も表示されませんが、保存して終了します。

確認

CustomerAとCustomerBそれぞれのユーザでログインして、「各顧客は自身のDeviceしか見られない」ようなDashboardになっているか確認します。そうなっているはずです。

まとめ

「テナントオーナーがDashboardを作成し複数の顧客に展開するが、各顧客は自身のDeviceしか見られない」ようなDashboardの作成方法について述べました。権限設定と同じく、わかってしまえば設定自体は難しくないと思います。

ThingsBoardはDevice, DashboardなどをEntityとして、これを束ねる上位概念(Group)をあらゆるEntityに適用する設計をすることで、Entity個別の実装を省き、どのEntityに対しても汎用的な機能を提供しているように見えます。ゆえに「いろんなことができる」一方で、「わかりづらさ」にもつながっているのではと思っています。

本記事はDashboardについての解説でしたが、Groupの扱い方に関しても理解が進むはずで、その上位概念が理解できればDashboard以外のEntityについてもわかってくるのでは。ThingsBoard活用の一助になれば幸いです。

Discussion