การดึงข้อมูลการผลิตแบบเรียลไทม์ด้วย Power BI

บทความนี้ 9Expert จะสอนวิธีสร้างเว็บเซอร์วิสที่ดึงข้อมูลการผลิตจากเครื่องจักรในโรงงานอุตสาหกรรม นำมาให้บริการเป็น API endpoint แล้วนำข้อมูลไปแสดงเป็นรายงาน Power BI ที่แสดงภาพข้อมูลการผลิตอัปเดตอัตโนมัติแบบเรียลไทม์
การดึงข้อมูลการผลิตแบบเรียลไทม์ด้วย Power BI
ทักษะ (ระบุได้หลายทักษะ)

การดึงข้อมูลการผลิตแบบเรียลไทม์ด้วย Power BI

บทความนี้ 9Expert จะสอนวิธีสร้างเว็บเซอร์วิสที่ดึงข้อมูลการผลิตจากเครื่องจักรในโรงงานอุตสาหกรรม นำมาให้บริการเป็น API endpoint แล้วนำข้อมูลไปแสดงเป็นรายงาน Power BI ที่แสดงภาพข้อมูลการผลิตอัปเดตอัตโนมัติแบบเรียลไทม์

แผนภูมิการพัฒนา API ข้อมูลการผลิตเพื่อทำรายงาน Power BI แบบเรียลไทม์

สิ่งที่ท่านต้องมีเพื่อทำตามบทความนี้

1.      เว็บเซิร์ฟเวอร์ที่สามารถโฮสต์เว็บซอร์วิส API endpoint ได้ (เว็บเซิร์ฟเวอร์ส่วนใหญ่มีคุณสมบัตินี้)
2.      โปรแกรม Visual Studio 2022 อัปเดตล่าสุด ติดตั้งเวิร์คโหลด “ASP.NET and web development” และ “.NET desktop development”
3.      บัญชี Microsoft Azure เพื่อสร้างและใช้งาน Azure Table Storage
4.      บัญชี Power BI ระดับพรีเมียม (Premium subscription) หรือ Pro เพราะมีฟีเจอร์ให้สร้างรายงานอัปเดตเรียลไทม์
 

อธิบายกลไก ASP.NET Core Minimal APIs

Minimal APIs คือ API แบบน้อยสุด ถูกออกแบบมาเพื่อการสร้าง HTTP API ที่พึ่งพาแพกเกจต่าง ๆ ต่ำสุด เหมาะสำหรับไมโครเซอร์วิสและแอพที่ต้องการทำ API ที่มีเฉพาะสิ่งที่จำเป็นจริง ๆ แทนที่เราจะต้องใช้คอนโทรลเลอร์ของ MVC บวกเฟรมเวิร์คขนาดใหญ่ เราแค่ใส่โค้ดเพียงไม่กี่บรรทัดลงในไฟล์ Program.cs โดยตรงก็ได้ API แล้ว

 

วิธีสร้างโปรเจ็กต์ Visual Studio แบบ ASP.NET Core Minimal APIs

ต่อไปนี้เราจะสร้างเว็บแอพชื่อ MinimalApi (หมายเลข 2 ในแผนภูมิพัฒนาฯ) เพื่อทำหน้าที่เป็นตัวให้บริการ API โดยมีขั้นตอนดังนี้
1.      เปิดโปรแกรม Visual Studio เลือก Create a new project
2.      เลือกเทมเพลตแบบ ASP.NET Core Empty (ถ้าไม่พบแสดงว่าท่านยังไม่ได้ติดตั้งเวิร์คโหลด “ASP.NET and web development” ไว้ใน Visual Studio) 

การเลือกเทมเพลต

3.      ตั้งชื่อโปรเจ็กต์ว่า MinimalApi
4.      เปิดไฟล์ program.cs จะเห็นโค้ดดังนี้

สร้างโปรเจ็กต์แล้วเปิดไฟล์ program.cs จะเห็นโค้ดดังนี้

5.      สิ่งที่ควรสนใจคือโค้ดบรรทัดที่ 10 เพราะนี่คือ API ที่จะทำงานเมื่อโปรแกรมเริ่ม หรือเมื่อมีแอพเรียก API แบบ get โดยไม่ระบุ endpoint
6.      ASP.NET Core Minimal APIs สนับสนุนAPI ทั้งแบบ get, post, put และ delete แต่ในบทความนี้เราจะใช้ get เท่านั้น
 

วิธีเขียนโค้ด C# เพื่อทำหน้าที่เป็น API endpoint

หัวข้อนี้เราจะมาดูวิธีเขียนโค้ด API แบบ get ที่มี endpoint ชื่อ ep1 (end point 1) วิธีทำเป็นดังนี้
1.ในโปรเจ็กต์ MinimalApi ให้แก้ไขไฟล์ program.cs โดยใส่โค้ดดังนี้
 

 // [email protected] March 2025
 namespace MininalApi
 {
 public class Program
 {
 public static void Main(string[] args)
 {
 var builder = WebApplication.CreateBuilder(args);
 var app = builder.Build();
  
 app.MapGet("/", () => "Hello World!");
  
 app.MapGet("/ep1", () => new
 {
 Name = "Endpoint1",
 Time = DateTime.Now.ToString("MM-dd-yy H:mm:ss"),
 Motor_Speed = Sim()
 });
 app.Run();
 }
  
 public static int Sim()
 {
 Random rnd = new Random();
 return rnd.Next(1, 13);
 }
 }
 }
ป้อนพิมพ์โค้ดนี้ลงในไฟล์ program.cs

2.      โปรดสังเกตโค้ดบรรทัดต่าง ๆ ดังนี้

  • บรรทัดที่ 13 ถึง 18 ทำหน้าที่เพิ่ม API แบบ get ที่มี endpoint ชื่อ ep1
  • บรรทัดที่ 13 คำว่า MapGet คือเมธอดของอินเตอร์เฟส IEndpointRouteBuilder ที่อยู่ในเนมสเปส Microsoft.AspNetCore.Routing ทำหน้าที่กำหนดเร้าติ้งว่าจะให้ไปทำงานอะไรเมื่อมีแอพภายนอกอ้างถึง endpoint (ในที่นี้คือ /ep1)
  • บรรทัดที่ 13 ใช้แลมป์ด้าเพื่อนิยามอะนอนิมัสฟังก์ชันไว้ในบรรทัดนี้เพื่อให้โค้ดกระชับ
  • บรรทัดที่ 14 ถึง 18 คือข้อมูลโครงสร้างแบบ Json ที่เราจะส่งให้แก่แอพที่เรียกมา

วิธีเขียนโค้ด C# สร้าง Simulator จำลองเครื่องจักรที่ให้ข้อมูลการผลิต

โรงงานอุตสาหกรรมจะมีข้อมูลจากเซ็นเซอร์ประเภทต่าง ๆ เป็นจำนวนมาก แต่การทดสอบโปรแกรมอาจไม่สะดวกต่อเชื่อมกับเครื่องจักร ราจึงสร้างเครื่องจักรจำลองด้วยโค้ดแบบสั้นที่สุด
 
ในโปรเจ็กต์ MininalApi ไฟล์ program.cs โค้ดบรรทัดที่ 22 ถึง 26 คือเมธอดเพื่อสร้างเครื่องจักรจำลอง (หมายเลข 1 ในแผนภูมิพัฒนาฯ) ซึ่งสมมติว่าเป็นค่าความเร็วรอบมอเตอร์ เป็นตัวเลขจำนวนเต็มของค่าสุ่มระหว่าง 1 ถึง 13 ในการใช้งานจริงให้ท่านแทนที่โค้ดเหล่านี้ด้วยโค้ดอ่านข้อมูลจากเซ็นเซอร์
 
 

การทดสอบ API endpoint โดยใช้โปรแกรม Postman

เมื่อแก้ไขโค้ดเสร็จแล้วเราสามารถทดสอบการทำงานของ endpoint ได้โดยใช้โปรแกรม postman (หมายเลข 7 ในแผนภูมิพัฒนาฯ) โปรแกรมนี้ฟรี ดาวน์โหลดได้จากเว็บไซต์ www.postman.com เมื่อติดตั้งเสร็จแล้วให้เริ่มการทดสอบโดยมีขั้นตอนดังนี้
1.      รันโปรแกรม MininalApi ด้วย Visual Studio โดยกดปุ่ม Ctrl+F5

รันเว็บแอพโดยการกดปุ่ม Ctrl+F5

2.      เมื่อรันแล้วจะมีเว็บบราวเซอร์ถูกเปิดขึ้น ให้คัดลอก URL ไว้ นี่คือ URL ของเว็บเซิร์ฟเวอร์ชั่วคราวที่ Visual Studio สร้างขึ้นในคอมพิวเตอร์ของเรา (หมายเลข 3 ในแผนภูมิพัฒนาฯ) เพื่อสะดวกในการทดสอบ (ตอนใช้งานจริงเราต้อง deploy โปรเจ็กต์ไปยังเว็บเซิร์ฟเวอร์ในคลาวด์ก่อน)

เมื่อเห็นเว็บบราวเซอร์ ให้คัดลอก URL ไว้

3.      เปิดโปรแกรม postman
4.      เลือก API เป็น GET
5.      ใส่ URL ที่คัดลอกไว้ แล้วพิมพ์ /ep1 ต่อท้าย นี่คือการระบุ endpoint
6.      กดปุ่ม Send เพื่อส่งคำร้องขอไปยังเว็บแอพ endpoint ชื่อ ep1 (หมายเลข 4 ในแผนภูมิพัฒนาฯ)
7.      ผลลัพธ์คือได้ Json ที่มีข้อมูลสามคอลัมน์ คือ name, time และ motor_speed

การทดสอบโปรแกรมด้วย postman

8.      ให้ลอง send หลาย ๆ หน โปรดสังเกตว่าแต่ละครั้ง ผลลัพธ์จะมีค่า time และ motor_speed ต่างกัน

 

วิธีสร้างโปรเจ็กต์ Visual Studio แบบ console เพื่อการทดสอบ API endpoint

ในหัวข้อนี้เราจะสร้างคอนโซลแอพชื่อ TestApi (หมายเลข 8 ในแผนภูมิพัฒนาฯ) เพื่อทดสอบ API แทนการใช้โปรแกรม postman วิธีทำเป็นดังนี้
1.      เปิดโปรแกรม Visual Studio เลือก Create a new project
2.      เลือกเทมเพลตแบบ Console App

เลือกเทมเพลตแบบ Console App

3.      ตั้งชื่อโปรเจ็กต์ว่า TestApi
4.      ติดตั้งแพคเกจ RestSharpNet40 ด้วย NuGet

ใช้ NuGet ติดตั้งแพคเกจ RestSharpNet40

5.      ใส่โค้ดนี้ลงในไฟล์ program.cs

ซอร์สโค้ดทดสอบการเรียก API endpoint
 // [email protected] Mar 2025
 using RestSharp;
 using System.Net;
  
 namespace TestApi
 {
 internal class Program
 {
 static async Task Main(string[] args)
 {
 var myClient = new RestClient("https://localhost:7042/ep1"); // แทนที่ด้วย URL ของท่าน
 var myRequest = new RestRequest(Method.GET);
 for (int i = 0; i < 4; i++)
 {
 IRestResponse myResponse = myClient.Execute(myRequest);
 if (myResponse.StatusCode.Equals(HttpStatusCode.OK))
 {
 var myResult = myResponse.Content;
 Console.WriteLine(myResult);
 }
 await Task.Delay(1000);
 }
 }
 }
 }

6.     รันโปรแกรม TestApi จะเห็นกรอบหน้าต่างคอนโซลเปิดขึ้น และเห็นการเรียก API endpoint สี่ครั้ง

ผลลัพธ์ของการเรียก API endpoint

วิธีนำข้อมูลจาก API endpoint ไปบันทึกไว้ใน Azure Table Storage

วิธีสร้างรายงาน Power BI ที่อัปเดตเรียลไทม์ ทำได้หลายวิธี (เช่น การเชื่อมต่อแบบสตรีม การรีเฟรชหน้าอัตโนมัติ การใช้กลไก Azure Stream Analytic การใช้แบบจำลอง Push และ PubNub เป็นต้น) ในบทความนี้เราจะใช้วิธีเชื่อม Power BI กับไฟล์ข้อมูล Azure ด้วยวิธี DirectQuery ดังนั้นก่อนที่เราจะสร้างรายงานใน Power BI ได้ เราจะต้องสร้างไฟล์ข้อมูลใน Azure แล้วบันทึกข้อมูลที่อ่านได้จาก endpoint ลงไปในไฟล์เสียก่อน
 
เราจะใช้ไฟล์ข้อมูลแบบ Azure Table Storage (หมายเลข 6 ในแผนภูมิพัฒนาฯ)  เพราะเป็นไฟล์ที่ไม่ซับซ้อน ไม่มีความสัมพันธ์ (ไม่จอยกับไฟล์อื่น) จึงประหยัดและเรียบง่ายกว่าไฟล์ฐานข้อมูล SQL Server
วิธีสร้าง Azure Table Storage  ทำได้ดังนี้
1.      ใช้เว็บบราวเซอร์เปิดหน้าหลักของ Microsoft Azure
2.      สร้าง Resource Group (ถ้ายังไม่มี)
3.      สร้าง Storage Account  (ถ้ายังไม่มี)

กดที่ปุ่ม + Create Storage account

4.      กำหนดค่าของ Storage Account ตามภาพแล้ว Create

ที่หัวข้อ Primary service เลือก Other

5.      ตรวจหา connection string โดยพิมพ์ว่า key ในช่องค้น (ตามภาพ) เมื่อพบแล้วให้คัดลอกไว้ เพราะเราจะต้องใช้มันในโค้ด

ค้นหาและคัดลอก Connection String

วิธีสร้างคอนโซลแอพ GetSaveData  (หมายเลข 5 ในแผนภูมิพัฒนาฯ) ซึ่งทำหน้าที่บันทึกข้อมูลที่อ่านได้จาก endpoint ลงสู่ไฟล์ข้อมูลแบบ Azure Table Storage ที่เราสร้างไว้ในขั้นตอนก่อนหน้าเป็นดังนี้
1.      ใน Visual Studio สร้างโปรเจ็กต์แบบ Console App
2.      ตั้งชื่อโปรเจ็กต์ว่า GetSaveData
3.      เพิ่มสาม NuGet แพคเกจตามภาพ

เพิ่มสาม NuGet แพคเกจ

4.      ป้อนพิมพ์ซอร์สโค้ดตามนี้
 

 // [email protected] Mar 2025
 using Azure;
 using Azure.Data.Tables;
 using Newtonsoft.Json;
 using RestSharp;
 using System.Net;
  
  
 namespace testGetApi
 {
 public class ApiData
 {
 public string? name { get; set; }
 public string? time { get; set; }
 public string? motor_speed { get; set; }
 }
  
 public class SampleEntity : ITableEntity
 {
 public string? Name { get; set; }
 public string? Time { get; set; }
 public string? Motor_speed { get; set; }
 // System Properties
 public string? PartitionKey { get; set; }
 public string? RowKey { get; set; }
 public DateTimeOffset? Timestamp { get; set; }
 public ETag ETag { get; set; }
 public SampleEntity(string name, string time, string motor_seed)
 {
 Name = name;
 Time = time;
 Motor_speed = motor_seed;
 PartitionKey = "pk" + DateTime.Now.ToString("MM-dd-yy H:mm:ss");
 RowKey = "rk";
 }
 }
  
 internal class Program
 {
 static void Main()
 {
 var myJsonString = GetApiValue();
 ApiData? myData = JsonConvert.DeserializeObject<ApiData>(myJsonString);
 Console.WriteLine($"Name: {myData?.name}");
 Console.WriteLine($"Time: {myData?.time}");
 Console.WriteLine($"Motor speed: {myData?.motor_speed}");
 InsertAzureTable(myData);
 }
  
 static string GetApiValue()
 {
 string apiResult = string.Empty;
 var myClient = new RestClient("endpoint URL here"); // แทนที่ด้วย URL ของท่าน
 var myRequest = new RestRequest(Method.GET);
 IRestResponse myResponse = myClient.Execute(myRequest);
 if (myResponse.StatusCode.Equals(HttpStatusCode.OK))
 {
 apiResult = myResponse.Content;
 }
 return apiResult;
 }
  
 static void InsertAzureTable(ApiData? myData)
 {
 var myCon = "insert connection string here"; // แทนที่ด้วย string ของท่าน
 var myClient = new TableServiceClient(myCon);
 TableClient myTable = myClient.GetTableClient("LoyTables");
 myTable.CreateIfNotExists();
 // Create a sample entity
 var myEntity = new SampleEntity(myData.name, myData.time, myData.motor_speed);
 myTable.AddEntity(myEntity);
 }
 }
 }


5.      ทำ deploy โปรแกรม MinimalApi ไปยังเว็บเซิร์ฟเวอร์ แล้วบันทึก URL ไว้
6.      แก้ไขโค้ดบรรทัดที่ 52 แทนที่ด้วย URL ของเว็บแอพ MinimalApi แล้วเพิ่ม /ep1 ไว้ที่ท้าย URL
7.      แก้ไขโค้ดบรรทัดที่ 66 แทนที่ด้วย connection string ของ Azure Table Storage ที่ท่านคัดลอกไว้ในหัวข้อวิธีสร้าง Azure Table Storage
8.      รันโปรแกรม GetSaveData  จะเห็นคอนโซลปรากฏขึ้นตามภาพ
 

รันโปรแกรมแล้วจะเห็นคอนโซลแบบนี้

9.      ให้รันโปรแกรม GetSaveData อีกสี่ครั้งเพื่อให้เกิดการบันทึกข้อมูลลงในตาราง 5 แถวข้อมูล
10.     วิธีตรวจสอบว่าเกิดการบันทึกข้อมูลลงในตารางจริงหรือไม่ทำได้โดยไปที่หน้า Azure portal / Storage Account / ชื่อ Storage Account ที่เราเพิ่งสร้างไปในขั้นตอนก่อนหน้า / Storage Browser / ชื่อตารางที่ตรงกับในโค้ดบรรทัดที่ 67

วิธีดูชมข้อมูลที่ถูกบันทึกลงสู่ตาราง

วิธีเชื่อมรายงาน Power BI กับ Azure Table Storage

เมื่อเราสร้าง Azure Table ที่อัปเดตข้อมูลจาก API endpoint ได้สำเร็จแล้ว ขั้นตอนต่อไปคือการสร้าง data source ภายใน Power BI ที่เชื่อมกับ Azure Table ผ่าน DirectQuery (หมายเลข 9 ในแผนภูมิพัฒนาฯ) ซึ่งมีวิธีทำดังนี้
1.      ตรวจหา URL ของ Azure Tabler โดยการเข้าไปใน Azure/ Storage Account/Storage browser/table แล้วคัดลอก URL ของ Table โดยไม่รวมชื่อตารางข้างท้าย URL (ไม่เอาคำว่า /LoyTables)

ค้นหาและคัดลอก URL ของตาราง

2.      เปิดโปรแกรม Power BI Desktop เข้าใช้งานด้วยบัญชี Power BI ระดับพรีเมียม (Premium subscription) หรือ Pro (เพราะถ้าใช้บัญชีแบบฟรีจะไม่มีฟีเจอร์ที่เราต้องการ)
3.      เลือก Get Data/Azure/Azure Table Storage แล้วกดปุ่ม Connect

การ Get Data

4.      เมื่อเห็นกรอบข้อความ Azure Table Storage ให้ใส่ URL ที่ท่านลอกมาจากขั้นตอนที่ 1 ลงในช่อง “account name or URL”

การใส่ URL ของตาราง

5.      เมื่อเห็นกรอบข้อความ Navigator ให้คลิกเลือกตารางใน Azure Table Storage ที่เราเก็บข้อมูล API endpoint

เลือกชื่อตารางจากรายการ

6.      ดูที่แถบ Data ทางขวาสุดจะเห็น data source ที่เราสร้าง เป็นเครื่องแสดงว่าการเชื่อมต่อ Power BI กับ Azure Table ด้วย DirectQuery สำเร็จแล้ว

ผลลัพธ์เมื่อสร้าง DirectQuery สำเร็จ

วิธีสร้างรายงานแบบเรียลไทม์ใน Power BI

ตอนนี้เราได้ data Source จากการทำ DirectQuery แล้ว จึงสามารถสร้างรายงานที่เปลี่ยนแปลงแบบเรียลไทม์ได้ เพื่อความประหยัดทรัพยากรของระบบ เราจะกำหนดให้รายงานรีเฟรชก็ต่อเมื่อ motor_speed เปลี่ยนค่าเท่านั้น วิธีทำมีขั้นตอนดังนี้
1.      สร้างรายงานใหม่ใน Power BI ใส่ visualizations (เช่น Line Chart) ที่ผูกกับข้อมูลจาก data Source ที่เราสร้างไว้ในหัวข้อที่ผ่านมา
2.      เลือกรายงานโดยกดที่พื้นที่ว่างบนตัวรายงาน กดปุ่ม Formatting บนแถบ  Visualizations แล้วเลือกหัวข้อ Page refresh (ถ้าไม่ได้ใช้บัญชี Power BI ระดับพรีเมียมหรือ Pro ตัวเลือกนี้จะไม่แสดง)

การปรับ Page refresh

3.      เปลี่ยน Off ให้เป็น On แล้วเลือก Change detection จากรายการ

เลือก Change detection

4.      ที่แถบเมนูบนสุด ให้กดที่หัวข้อ Modeling แล้วกดปุ่ม Change detection (ถ้าไม่ได้ใช้บัญชี Power BI ระดับพรีเมียมหรือ Pro จะเลือกตัวเลือกนี้ไม่ได้)

เลือก Change detection

5.      จะเห็นหน้าต่าง Change detection ปรากฏขึ้น ให้ตั้งค่าต่าง ๆ ตามภาพ

เลือกฟิลด์ความเร็วของมอเตอร์

6.      ถึงขั้นตอนนี้เราได้หน้ารายงานที่จะรีเฟรชทุกครั้งเมื่อ motor_speed เปลี่ยนค่า ให้ทดสอบโดยรันโปรแกรม GetSaveData โปรดสังเกตว่ารายงานจะอัปเดตเองทุกครั้งที่เรารัน GetSaveData

รายงาน Power BI ที่แสดงภาพข้อมูลการผลิตอัพเดตอัตโนมัติแบบเรียลไทม์

7.      ในการใช้งานจริงให้ดัดแปลงโค้ด GetSaveData ให้ทำงานทุก ๆ สิบวินาทีหรือตามระยะเวลาที่กำหนด
8.      หากท่านต้องการนำรายงานไปฝังไว้ในหน้าเว็บให้ดูวิธีทำในบทความ วิธีการแชร์ Power BI Report | 9Expert
 

สรุปเนื้อหา

ในบทความนี้ 9Expert ได้นำเสนอวิธีสร้างเว็บแอพที่ดึงข้อมูลการผลิตจากเครื่องจักรในโรงงานอุตสาหกรรม แล้วเปิดให้มี API endpoint เพื่อให้แอพอื่น ๆ สามารถนำข้อมูลการผลิตไปใช้ทำสิ่งต่าง ๆ โดยยกตัวอย่างการนำไปใช้ทำรายงาน Power BI ที่อัปเดตอัตโนมัติแบบเรียลไทม์ บทความนี้มีโค้ดภาษา C# สามโปรเจ็กต์ ได้แก่ (1)MinimalApi เว็บแอพ ASP.NET Core ทำหน้าให้บริการ endpoint (2)TestApi คอนโซลแอพเพื่อทดสอบ API endpoint และ (3)GetSaveData คอนโซลแอพเพื่อนำข้อมูลจาก API endpoint ไปบันทึกไว้ที่ Azure Table Storage หากไม่ต้องการป้อนพิมพ์โค้ดท่านสามารถเข้าถึงซอร์สโค้ดได้ที่ https://gist.github.com/laploy