以下のDocsを試したので備忘録
Power BI のリアルタイム ストリーミング - Power BI | Microsoft Docs
データセット作成
リアルタイムデータセットを作成しておき、データソースを選択する。APIを選択するとPBI側にデータをPOSTできるAPIが作られます。
データセットのスキーマを定義します。よくある温度と湿度を追加しておきます。ストリーミングデータなので時間が必要です。
POST先のAPIが表示されます。
ダッシュボードの作成
リアルタイムデータのタイルを追加します。
データセットを選択し、表示するグラフの詳細を定義します。以下の場合ですと、温度を5分枠で折れ線グラフ表示することになります。
さらに湿度グラフと、テキストを表示するタイルを追加して、全体的に以下のようなレイアウトを実装します。
それっぽいデータの用意
データの用意が面倒ですので、以下より適当に温度と湿度を含むデータ(CSV)をダウンロードしておきます。
リアルタイムデータですので、このデータの時間軸は無視しておきます。
POSTするプログラム
適当にCSVからデータを読み込んでJSONでPOSTするプログラムを作成します。 先ほども述べたとおりPOSTするときは現在時刻にしておきます、1秒間隔でPOSTしていきます。 POST時の制限は、DocsのURLからたどれます。
ちょと動かすだけなら、適当にランダムな値をPOSTするだけでも問題ないと思いますけど、なんとなく意味ある値にしたかったので気象データ使いました。
class Program { string uri = "https://api.powerbi.com/beta/....."; static void Main(string[] args) { new Program().Run().GetAwaiter().GetResult(); } public async Task Run() { using (var reader = File.OpenText("data.csv")) { // Skip headers for (int i = 0; i < 6; i++) reader.ReadLine(); var csv = new CsvReader(reader); while (await csv.ReadAsync()) { DateTime now = DateTime.Parse(csv[0]); double tempu = double.Parse(csv[1]); double humid = double.Parse(csv[9]); var ds = new StreamingDataset() { Datetime = DateTime.Now, Temperature = tempu, Humidity = humid }; await Post(ds); await Task.Delay(TimeSpan.FromMilliseconds(1000)); Console.WriteLine($"{now} : {tempu} {humid}"); } } Console.ReadLine(); } private async Task Post(StreamingDataset ds) { var client = new HttpClient(); var content = JsonConvert.SerializeObject(ds); await client.PostAsync(uri, new StringContent(content)); } } public class StreamingDataset { [JsonProperty("datetime")] public DateTime Datetime { get; set; } [JsonProperty("temperature")] public double Temperature { get; set; } [JsonProperty("humidity")] public double Humidity { get; set; } }
実行結果
プログラムを実行するとPBIのDashboardがニョロニョロと動き始めます。
とりあえず、データソースが直接データをPOSTできるなら、これもありでしょうか。
以上。