からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

Microsoft Teams Framework (TeamsFx) が公開されました

Microsoft Build 2021 のタイミングだと思いますが、Microsoft Teams Toolkit が更新され、同時に Microsoft Teams Framework (TeamsFx) が公開されています。

github.com

すべての機能を追い切れていませんが、具体的にどんなものかというと、Microsoft Teams アプリを開発するときにこれまでいろいろと面倒だった手の届かないかゆいところを全部面倒を見てくれます。例えば、

  • localhost でホストをするときの自己証明書のインストールをやってくれる
  • localhost でホストをするときの Azure AD アプリケーションの作成をやってくれる
  • デバッグ時にパッケージのインストール (npm install)、バックエンド サーバー (node.js) の起動、フロントエンド サーバー (react-scripts) の起動、ブラウザーの起動を一連のタスクとしてやってくれる
  • Microsoft Graph への接続 (Microsoft Graph SDK との連携) をやってくれる
  • teamfx のコマンドラインでプロビジョニングやデプロイもやってくれる

多機能すぎて何が何だかよくわからないです。既存のアプリに適用する必要はあまりないかもしれませんが、これから新しく作るアプリではかなり役立ってくれそうな気がします。

Microsoft Bookings で予約がされたときのイベントを Power Automate でトリガーする

Microsoft Bookings にしばらく触っていなかったのですがいつの間にか Microsoft Teams 会議に対応していました。COVID-19 の状況下においてオンライン会議の予約ができるのは嬉しいですね。Microsoft Bookings だけでもだいたいのことは完結するのですが、そこにカスタムでちょっと何かをしたい場合、やはり Power Automate を使って予約がされたときのイベントをトリガーしたいです。

改めて Microsoft Bookings の仕組みを確認してみます。ビジネスを新しく作成すると Azure AD にユーザーが作られます。このユーザーはライセンスを持たないですが Exchange のメールボックスを持っています。そして予約が作成されると、このユーザーを開催者としてイベントが作成され、スタッフに会議出席依頼が出されます。*1 要するに、このユーザーに対してイベントが作成されたときをトリガーすればよさそうです。

Power Automate で接続を作成するにはユーザーにログインする必要があります。しかし自動的に作成するユーザーのパスワードはわからないので一度リセットしてあげる必要があります。*2 トリガーとしては「新しいイベントが作成されたとき」を使用します。このトリガーの出力からは大した情報を得ることはできませんが、そこから Microsoft Graph の Bookings API を呼び出すことで詳細な情報を取得することができます。

docs.microsoft.com

ただし Power Automate には Bookings API のコネクタはないので、HTTP アクション、つまりプレミアム コネクタの利用が必要になります。場合によっては Logic Apps を使うことも検討したほうがいいかと思います。

*1:オンライン会議を有効にしたときはこのタイミングで Microsoft Teams 会議が作成されます。

*2:パスワードをリセットしても動作には影響ありません。

SharePoint Online のモダン サイトでニュースの一覧を表示する

SharePoint Online のモダン サイトで標準のニュース Web パーツがあるのですが、指定した件数しか表示できないので、新しいニュースがあると古いニュースが流れてしまいます。[すべて表示] をクリックすればすべてのニュースが見られるのですが、ひと手間かかるのと、タイトルを非表示にしていると表示されないので、ちょっと面倒だったりします。可能であれば Web パーツとして一覧表示したいです。

結論からいうと、件数の制限がなく表示できるようにするには、ドキュメント ライブラリの Web パーツを使うのがよさそうです。*1 さっそくドキュメント ライブラリの Web パーツを貼り付けてサイト ページを表示してみます。

f:id:karamem0:20210519145930p:plain

なんかいまいち。ファイル名だと何のニュースかわかりません。新しく「すべてのニュース」という名前でビューを作成して「名前」列の代わりに「タイトル」列を出すようにします。

f:id:karamem0:20210519145948p:plain

ほぼよさそうに見えますが少しだけ問題があります。サイト ページには通常のページとニュースのページが混在していますがニュースだけを表示したいです。ニュースかどうかは「昇格された状態 (PromotedState)」列で判断できますが、既定では非表示になっていて UI からはフィルターの設定ができません。よって PowerShell で操作をすることになります。方法としては 2 通りあります。

  1. 一時的に「昇格された状態」列を表示する
  2. ビューの CAML を直接修正する

今回は一発でできる後者の方法をやってみます。スクリプトは以下の通りです。前提として PnP PowerShell を使用します。

$SITE_URL = '{{siteurl}}'
$LIST_NAME = '{{listname}}'
$VIEW_NAME = '{{viewname}}'
$CAML = @'
<Where>
    <Eq>
        <FieldRef Name="PromotedState" />
        <Value Type="Number">2</Value>
    </Eq>
</Where>
'@
Connect-PnPOnline -Url $SITE_URL -Credentials (Get-Credential)
Get-PnPView -List $LIST_NAME -Identity $VIEW_NAME | Set-PnPView -Values @{ ViewQuery = $CAML }

実行すると今まであった「ホーム」がなくなっていることがわかります。これでニュースの一覧を出すことができました。

f:id:karamem0:20210519151926p:plain

*1:注意点として、ドキュメント ライブラリの Web パーツは自身のサイトのドキュメント ライブラリしか表示できない、という制約が発生します。

IBS-TH1 と Azure IoT Hub と Power BI を使って部屋の温湿度を可視化する

GW の自己学習として IoT に手を出してみたかったのですが、Raspberry Pi で電子工作は敷居が高かったので、お手軽にできる方法を探してみました。我が家には古い Intel NUC があり、これを使ってなんとかできないかと思ったところ、Bluetooth を使った温湿度センサーというのがあるらしいことがわかりました。なかでも Inkbird の IBS-TH1 というのが安価でいいみたいです。さっそくこれを購入して IoT してみることにしました。

アーキテクチャ

最終的にこんな感じになりました。

f:id:karamem0:20210505170925p:plain

Azure IoT Hub へのデータの送信

Intel NUC でバッチ プログラムを実行し、IBS-TH1 に対して Bluetooth でデータを取得し、Azure IoT Hub に送信します。最初は Windows サービスで作ろうとしたのですが、データのキャッシュの問題でうまくいかなかったので、シンプルにバッチ プログラムに変更し、タスク スケジューラーで定期的に呼び出すことにしました。IBS-TH1 は Bluetooth Low Energy に対応しているため、ペアリングなしでデータを取得することができます。IBS-TH1 からのデータの取り方についてはすでに先行の記事があるので参考にしていただければと思います。

qiita.com

データを取るのに必要なものは MAC アドレスと Attribute ハンドルです。MAC アドレスはモバイル アプリから確認できるようです。Attribute ハンドルは 0x2d とありますが、こちらのコメントを見ると 0x28 だったり個体差があります。購入したものは 0x27 でした。データの 1-2 バイト目が温度、3-4 バイト目が湿度です。バッテリーの残量も取れるとありましたが、購入したものだとうまく取れませんでした。

バッチ プログラムのコードは以下に公開しています。

github.com

それほど難しくないので見ればだいたい理解できると思いますが流れをまとめておきます。

  • BluetoothLEAdvertisementWatcher を使って Bluetooth Low Energy のデバイスをスキャンします。
  • MAC アドレスが一致する場合、デバイスの情報を取得します。
  • デバイスの GATT サービスを取得します。IBS-TH1 ではサービスは 1 つです。
  • サービスのキャラクタリスティックを取得します。先ほど書いた Attribute ハンドルに一致するものをフィルターします。
  • データを取得します。
  • 取得したデータを Azure IoT Hub に送信します。

Azure でのメッセージング

Azure IoT Hub はそれ自体はデータを溜め込むことができないので他のサービスに受け流す必要があります。Azure IoT Hub にもルーティングの機能はあるのですが Azure Stream Analytics を使うのが一般的なようです。Azure Stream Analytics は SQL に似た言語で入力をクエリして他のサービスに出力することができます。今回は Azure IoT Hub で受け取ったデータを Azure Table Storage と Azure Service Bus に転送します。Azure Stream Analytics には Power BI のストリーミング データセットに書き込む機能もあるのですが、後に述べるタイムゾーンの変換を行うために、あえて Azure Logic Apps を経由するようにしました。これはユーザー定義関数がすべてのリージョンで使えるようになればもう少し簡単にできると思います。

Azure Service Bus はシンプルに Azure Logic Apps と連携するためのハブとして存在します。Azure Logic Apps ではキューを読み込み、データの加工をしたのち Power BI のストリーミング データセットにレコードを追加します。Power BI のストリーミング データセットを使ったレポートでは、そのままの日時では UTC で表示されてしまい、Power Query を使った変換もできないため、ストリーミング データセットに入れるタイミングで JST に変換してあげる必要があります。

Power BI レポート

過去 24 時間のデータを表示するようにしてみました。いい感じに可視化されていますね。

f:id:karamem0:20210505213355p:plain

まとめ

Azure Functions を使うともう少しシンプルな構成にできたのですが、Azure はノーコードでやりたかったのでこのような構成になりました。あまり触ったことがないサービスばかりだったのでいろいろと勉強になることが多かったです。意外に通信距離が長そうなので他の部屋向けにも買ってみてもいいかなと思いました。

Microsoft 365 Virtual Marathon 2021 に登壇しました

今年も開催されました Microsoft 365 Virtual Marathon に登壇しました。今回は 1 日目にパネル ディスカッションとして Power Platform について、2 日目にセッションとして Microsoft Teams アプリ開発についてお話ししました。

Power Platform のはじめかた

さまざまな立場から Power Platform にかかわっている人たちが集まって Power Platform をはじめるときに気を付けることなどについてパネル ディスカッションを行いました。ほかの Power Platform のセッションでも皆さん繰り返しおっしゃられていましたが、アプリを作る上で「何を改善するのか」ということを考えることは非常に重要だと思いますので、まずは普段の業務の整理をしていただいて「こういうところが効率化できる」というポイントを探っていただければと思います。

50 分一本勝負!ライブ コーディングで Microsoft Teams アプリを作ってみる

50 分とタイトルに書きつつ実質 30 分だったのですが、Microsoft Teams アプリ (タブ アプリ) を Microsoft Teams Toolkit を使って作成するデモをしました。内容的にはこちらの記事で紹介したものと同じで、プラス認証のところを紹介して時間切れになってしまいました。

blog.karamem0.dev

動画は後日無料で (当初有料とご案内していましたが無料になりました) 公開されます。非常にためになるセッションが多かったのでぜひ YouTube のチャンネル登録をお願いします。

www.youtube.com