<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pattanapong Cherthong</title>
    <description>The latest articles on DEV Community by Pattanapong Cherthong (@teampat).</description>
    <link>https://dev.to/teampat</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620136%2F54a6d04e-8037-4dce-b839-a3d5be512041.jpeg</url>
      <title>DEV Community: Pattanapong Cherthong</title>
      <link>https://dev.to/teampat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/teampat"/>
    <language>en</language>
    <item>
      <title>วิธีแก้ git conflict เบื้องต้นใน Virtual Studio Code</title>
      <dc:creator>Pattanapong Cherthong</dc:creator>
      <pubDate>Sat, 13 Sep 2025 08:39:40 +0000</pubDate>
      <link>https://dev.to/teampat/withiiaek-git-conflict-ebuuengtnain-vs-code-3325</link>
      <guid>https://dev.to/teampat/withiiaek-git-conflict-ebuuengtnain-vs-code-3325</guid>
      <description>&lt;p&gt;เหตุการณ์สมมุติคือ ใน git repo เดียวกัน มี Dev 2 คน กำลังแก้ไฟล์เดียวกัน Dev คนแรกแก้ไข commit และ push ขึ้น git repo เรียบร้อย แต่มี Dev คนที่ 2 คือคุณเอง มาแก้ไข code บรรทัดเดียวกันกับคนแรกที่เพิ่งแก้ไป&lt;/p&gt;

&lt;p&gt;1.หลังจากนั้นคุณก็มีการแก้ไขไฟล์ ทำการ Add และ Commit เสร็จ ใน Source Control ถ้า git repo มีอัพเดทใหม่ จะขึ้นปุ่ม Sync Change ให้เรากด&lt;br&gt;
แต่พอกด Sync Change พบว่าเจอ Popup แบบนี้ &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F448km338msi0tv2ioo5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F448km338msi0tv2ioo5m.png" alt="Git popup" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.ให้กดปุ่ม Show Command Output เพื่อดูว่าเกิดอะไรขึ้น ปรากฏว่ามี git error แบบนี้&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxktjhmb78vxd3bnpl2j5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxktjhmb78vxd3bnpl2j5.png" alt="Git error" width="800" height="439"&gt;&lt;/a&gt;&lt;br&gt;
ลองสั่ง git pull ใน Terminal ก็ขึ้นมาเหมือนกัน &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1haegc0xzqra4uizrpk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1haegc0xzqra4uizrpk.png" alt="Git hint" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.ในข้อความ hint อยากให้คุณตัดสินใจว่าจะ merge หรือ rebase &lt;br&gt;
เพื่อที่จะ merge conflict คุณจะต้องตั้งค่าเพื่อไม่ให้ rebase ด้วยคำสั่งนี้ใน Terminal&lt;br&gt;
(ขั้นตอนนี้เราจะทำครั้งแรกครั้งเดียวเท่านั้น ของแต่ละ repo ในเครื่อง)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config pull.rebase false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.หลังจากนั้นกดปุ่ม Sync Change ใน Source Control อีกครั้ง หรือ สั่ง git pull ก็ใน Terminal อีกครั้งจะบบว่าไฟล์ที่เราเพิ่งแก้ไป จะมี highlight ขึ้นในบรรทัดที่ชนกัน&lt;br&gt;
ให้เราตัดสินใจว่าจะเลือกฝั่งไหนหรือเอาทั้งคู่ &lt;br&gt;
(ถ้าสั่ง git pull ใน Terminal จะมีบอกเราด้วยว่าไฟล์ไหนมี Conflict กันบ้าง)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu8ko8d7ksim99ndzrym.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu8ko8d7ksim99ndzrym.png" alt="Fix conflict" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.พอเราแก้ conflict เสร็จแล้ว ก็ Add (หรือเรียก Stage แล้วแต่ถนัด) และ Commit ตามปกติ จะมี popup มาถามว่าจะ merge conflicts ใช่ไหม ก็ตอบ Yes ได้เลย&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lpniula31f5qg65akiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lpniula31f5qg65akiy.png" alt="Git commit" width="800" height="413"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F646hnn5qrgpqb41msnxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F646hnn5qrgpqb41msnxr.png" alt="Git merge popup" width="795" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.ตอนนี้เราก็สามารถ commit และ กด Sync Change ได้ตามปกติ (หรือสั่ง git pull และ git push ใน Terminal ก็ได้)&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>git</category>
      <category>vscode</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ตั้งค่า nginx ให้รับ IP จริง จาก client เมื่อเว็บเราอยู่หลัง Cloudflare</title>
      <dc:creator>Pattanapong Cherthong</dc:creator>
      <pubDate>Mon, 11 Mar 2024 16:07:14 +0000</pubDate>
      <link>https://dev.to/teampat/tangkhaa-nginx-aihrab-ip-cchring-cchaak-client-emuueewberaayuuhlang-cloudflare-50h5</link>
      <guid>https://dev.to/teampat/tangkhaa-nginx-aihrab-ip-cchring-cchaak-client-emuueewberaayuuhlang-cloudflare-50h5</guid>
      <description>&lt;p&gt;เมื่อเราผูกโดเมนกับ dns server ของ cloudflare ซึ่ง cloudflare จะทำหน้าที่เป็นด่านหน้าแทน web server ของเราอีกชั้นนึง ทำหน้าที่เป็น reverse proxy เป็น cdn ช่วยให้เว็บเข้าได้เร็วจากทั่วทุกมุมโลก ทำหน้าที่เป็น web application firewall ป้องกันการโจมตีให้เราได้เบื้องต้น ป้องกันการ ddos ให้เราได้ค่อนข้างดี cloudflare มีให้เรามากขนาดนี้ตั้งแต่แพคเกจฟรี แบบว่าให้ใช้ฟรีซะจนเกรงใจ&lt;/p&gt;

&lt;p&gt;เมื่อมี cloudflare มาทำหน้าที่ reverse proxy เป็นด่านหน้าให้ web server ของเรา ข้อจำกัดอย่างหนึ่งก็คือ โดยปกติฝั่ง web server จะไม่ได้รับข้อมูล IP ของ client หรือของผู้เข้าชมเว็บไซต์ที่แท้จริงโดยตรง แต่กลายเป็นว่าได้รับ IP ของ cloudflare ซะเองที่กั้นหน้าอยู่ ทำให้การเก็บ access log หรือ audit log ในฝั่ง web server ได้รับข้อมูลไม่ตรงตามความจริง แต่ cloudflare ก็ยังใจดีแปะ Original IP ของ Client มากับ Header ให้เราด้วย&lt;/p&gt;

&lt;p&gt;สรุปให้เข้าใจง่าย&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;คนเข้าเว็บ → วิ่งไปหา Cloudflare ก่อน → Cloudflare ส่งต่อมาที่เซิร์ฟเวอร์คุณ&lt;/li&gt;
&lt;li&gt;ทำให้ IP ที่เซิร์ฟเวอร์คุณได้ จะเป็น IP ของ Cloudflare ไม่ใช่ IP คนเข้าเว็บจริงๆ&lt;/li&gt;
&lt;li&gt;Cloudflare ก็เลยต้องแปะ IP จริงของคนเข้าเว็บผ่าน header ชื่อ CF-Connecting-IP และ X-Forwarded-For &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;หลายๆคนอาจจะมองข้ามเรื่องการเก็บ access logs แต่ถ้าหากเกิดอะไรขึ้นกับเว็บและข้อมูลสำคัญบน server ยังสามารถสืบหา hacker ได้จาก IP Address ซึ่งก็เคยมีประสบการณ์ในการติดตาม hacker จาก IP Address และส่งข้อมูลให้ตำรวจดำเนินคดีกับ hacker มาแล้ว  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;การตั้งค่าใน nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;สำหรับ nginx จำเป็นจะต้องใช้โมดูลที่ชื่อว่า ngx_http_realip_module ซึ่งถ้าติดตั้ง nginx ปกติ หรือรัน docker nginx ก็จะมี built in มาให้พร้อมแล้วในตัว เว้นแต่ใครที่เอา source code ของ nginx มา compile เองก็อย่าลืม enable module นี้ด้วย&lt;/p&gt;

&lt;p&gt;สิ่งที่เราจะต้องทำก็คือ ต้องเซ็ตค่า set_real_ip_from และ real_ip_header เพิ่ม&lt;/p&gt;

&lt;p&gt;ทำไมต้องกำหนด set_real_ip_from&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;set_real_ip_from คือการบอกว่า ถ้า request มาจาก IP ของ Cloudflare เท่านั้น ถึงจะเชื่อถือ CF-Connecting-IP และ X-Forwarded-For&lt;/li&gt;
&lt;li&gt;ถ้าไม่ตั้งไว้ Nginx จะมองว่า IP ของคนเข้าเว็บ = IP Cloudflare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1.เริ่มจากสร้างไฟล์ config ไว้ที่ /etc/nginx/cloudflare.conf เพิ่มข้อมูลไฟล์ตามด้านล่างนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#Cloudflare

# - IPv4
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

# - IPv6
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

real_ip_header CF-Connecting-IP;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;โดยที่เรากำหนด IP ของ Cloudflare นั้นเพื่อเป็นการ whitelist IP ป้องกันการ spoof หรือปลอมแปลง IP ที่ส่งมากับ header และ Nginx จะกำหนดตัวแปร remote_addr ให้เป็น IP จริงของผู้ใช้ เมื่อ request มาจาก Cloudflare เท่านั้น&lt;/p&gt;

&lt;p&gt;อัพเดท list ips ของ cloudflare ได้จาก link นี้ &lt;a href="https://www.cloudflare.com/ips/" rel="noopener noreferrer"&gt;https://www.cloudflare.com/ips/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.แก้ไขไฟล์ /etc/nginx/nginx.conf และเพิ่ม include ให้อยู่ภายใน http{....} block ตามตัวอย่างด้านล่าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http {

    include /etc/nginx/cloudflare.conf; 

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.แก้ไขเสร็จแล้วก็ให้ restart nginx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl nginx restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;การตั้งค่าสำหรับ Nginx Ingress Controller บน Kubernetes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ConfigMap for Nginx Ingress Controller
data:
  use-forwarded-headers: "true"
  forwarded-for-header: "CF-Connecting-IP"
  proxy-real-ip-cidr: |
    &amp;lt;Pod CIDRs&amp;gt;,
    &amp;lt;Node CIDRs&amp;gt;,
    &amp;lt;Load Balancer CIDRs&amp;gt;,
    &amp;lt;Cloudflare CIDRs&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data:
  use-forwarded-headers: "true"
  forwarded-for-header: "CF-Connecting-IP"
  proxy-real-ip-cidr: |
    &amp;lt;Pod CIDRs&amp;gt;,
    &amp;lt;Node CIDRs&amp;gt;,
    &amp;lt;Load Balancer CIDRs&amp;gt;,
    173.245.48.0/20,
    103.21.244.0/22,
    103.22.200.0/22,
    103.31.4.0/22,
    141.101.64.0/18,
    108.162.192.0/18,
    190.93.240.0/20,
    188.114.96.0/20,
    197.234.240.0/22,
    198.41.128.0/17,
    162.158.0.0/15,
    104.16.0.0/13,
    104.24.0.0/14,
    172.64.0.0/13,
    131.0.72.0/22,
    2400:cb00::/32,
    2606:4700::/32,
    2803:f800::/32,
    2405:b500::/32,
    2405:8100::/32,
    2a06:98c0::/29,
    2c0f:f248::/32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สำหรับ Nginx Ingress Controller ให้กำหนดค่า IPs ใน proxy-real-ip-cidr ใน ConfigMap ซึ่งนอกจากจะใส่ IP ของ Cloudflare แล้ว จะต้องเพิ่ม IP ของ Load balancer, Node , และ Pod เข้าไปด้วย&lt;/p&gt;

&lt;p&gt;reference &lt;a href="https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/" rel="noopener noreferrer"&gt;https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>แนะนำวิธีการติดตั้ง Home Assistant บน SSD (External USB storage) </title>
      <dc:creator>Pattanapong Cherthong</dc:creator>
      <pubDate>Mon, 21 Jun 2021 17:01:07 +0000</pubDate>
      <link>https://dev.to/teampat/home-assistant-ssd-external-usb-storage-50c8</link>
      <guid>https://dev.to/teampat/home-assistant-ssd-external-usb-storage-50c8</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfo1jxi0nlbrdnrzrn4p.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfo1jxi0nlbrdnrzrn4p.jpeg" alt="Raspberry Pi4 + SSD"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyuq069efdhjnjwws4nn9.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyuq069efdhjnjwws4nn9.jpeg" alt="Raspberry Pi Imager"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;สำหรับ Raspberry PI4 และ PI 400 เท่านั้น เพื่อประสิทธิภาพในการอ่านเขียนที่ดีกว่า SD Card&lt;br&gt;
อ้างอิงจากเว็บ raspberrypi.org สำหรับ Raspberry PI4 และ PI 400 เท่านั้น ที่จะมี SPI-attached EEPROM เอาไว้เก็บการตั้งค่าการ Boot จึงจะสามารถทำวิธีนี้ได้&lt;br&gt;
&lt;a href="https://www.raspberrypi.org/.../raspberrypi/booteeprom.md" rel="noopener noreferrer"&gt;https://www.raspberrypi.org/.../raspberrypi/booteeprom.md&lt;/a&gt;&lt;br&gt;
เพื่อประกอบการตัดสินใจเลือกซื้อ จะมีรายชื่ออุปกรณ์ที่มีคน Test แล้วว่าใช้งานได้กับ Raspberry PI4 ดูได้จากลิงค์นี้ครับ&lt;br&gt;
&lt;a href="https://jamesachambers.com/raspberry-pi-4-usb-boot.../" rel="noopener noreferrer"&gt;https://jamesachambers.com/raspberry-pi-4-usb-boot.../&lt;/a&gt;&lt;br&gt;
สิ่งที่ต้องเตรียม&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SD Card สำหรับ Bootlodaer (ใช้งานชั่วคราวเฉพาะตอนติดตั้ง)&lt;/li&gt;
&lt;li&gt;USB Drive (External SSD)&lt;/li&gt;
&lt;li&gt;Card Reader
ก่อนอื่นก่อนใดให้ทำ Snapshot เพื่อ Backup Home Assistant ของท่านไว้ก่อน&lt;/li&gt;
&lt;li&gt;Download Raspberry Pi Imager &lt;a href="https://www.raspberrypi.org/software/" rel="noopener noreferrer"&gt;https://www.raspberrypi.org/software/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;เปิดโปรแกรม Raspberry Pi Imager&lt;/li&gt;
&lt;li&gt;ให้เลือก OS โดยเลือก Misc utility images under &amp;gt; Bootloader 
จะมีให้เลือก 3 แบบ ให้เลือก USB Boot&lt;/li&gt;
&lt;li&gt;เลือก Storage ให้เลือก SD Card ปลายทางและทำการ flash &lt;/li&gt;
&lt;li&gt;นำ SD Card ไปใส่ Raspberry Pi แล้วเปิดเครื่อง&lt;/li&gt;
&lt;li&gt;รอประมาณ 10 วินาที จนกว่าไฟ LED สีเขียวจะกะพริบ 
(ขั้นตอนนี้จะเป็นการบันทึกลำดับการ Boot ให้ Boot USB เป็นอันดับแรกลง EEPROM)
ดูตัวอย่างในคลิปนี้ 
&lt;a href="https://www.youtube.com/watch?v=HA1C1wgyJfI&amp;amp;t=331s" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=HA1C1wgyJfI&amp;amp;t=331s&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ถอดปลั๊กและถอด SD Card ได้เลย&lt;/li&gt;
&lt;li&gt;ให้ทำการติดตั้ง Home Assistant จาก image ของ Raspberry Pi 4 ตามปกติ เพียงแต่เลือกปลายทางเป็น External SSD &lt;/li&gt;
&lt;li&gt;นำ External SSD มาเสียบที่ช่อง USB 3.0 (ช่องสีฟ้า) ของ Raspberry PI&lt;/li&gt;
&lt;li&gt;เสียบปลั๊ก Raspberry PI เพียงเท่านี้ก็จะ Boot เข้า USB เป็นอันดับแรกหลังจากนั้นก็จะ Boot เข้า Home Assistant ที่อยู่ใน USB Drive ของเราแล้ว และไม่จำเป็นต้องเสียบ SD Card ค้างไว้ด้วย&lt;/li&gt;
&lt;li&gt;ถ้าหากมี Snapshot ก็เอามา restore ใช้งานต่อเนื่องได้เลยครับ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;แต่ถ้าหากจะกลับไป Boot ด้วย SD Card ตามเดิม ให้ทำแบบเดียวกับขั้นตอนที่ 1-6 แต่ให้เลือก Bootloader เป็น SD Card Boot&lt;/p&gt;

</description>
      <category>hassio</category>
      <category>homeassistant</category>
      <category>ssd</category>
      <category>raspberrypi</category>
    </item>
    <item>
      <title>ลืมปิดแอร์ไม่เป็นไร เดี๋ยว Node-RED ปิดแอร์ให้ ใน Home Assistant</title>
      <dc:creator>Pattanapong Cherthong</dc:creator>
      <pubDate>Sat, 19 Jun 2021 21:13:07 +0000</pubDate>
      <link>https://dev.to/teampat/node-red-home-assistant-4i3c</link>
      <guid>https://dev.to/teampat/node-red-home-assistant-4i3c</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdujw4cub5acb6k03v0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdujw4cub5acb6k03v0u.png" alt="Full Node-RED Workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ก่อนที่จะสร้าง Node-RED Workflow มาทำความเข้าใจในส่วนของการ tracking กันก่อนครับ ใน Home Assistant ถ้าต้องการจะ tracking ว่าสมาชิกในบ้านคนนี้ อยู่บ้านหรือไม่ สามารถ tracking ได้หลายๆทางเพื่อความแม่นยำ โดยสามารถเข้าไปเซ็ตได้ใน Configuration &amp;gt; People จะมีให้ใส่ device สำหรับการ tracking&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryi5qs7yyfk0cb66bthi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryi5qs7yyfk0cb66bthi.png" alt="Screen Shot 2564-06-20 at 01.49.31"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fda6kya0jtf1yeatjdf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fda6kya0jtf1yeatjdf.png" alt="Screen Shot 2564-06-20 at 01.52.34"&gt;&lt;/a&gt;&lt;br&gt;
ซึ่งผมได้ tracking จาก 2 ทางคือ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entity จากแอพ Home Assistant ในมือถือ โดยจะเช็คจาก Location ล่าสุด ว่าอยู่ในบริเวณบ้าน หรือ ออกนอกบริเวณบ้านไปแล้ว&lt;/li&gt;
&lt;li&gt;และเนื่องจาก MikroTik integration สามารถดึง Entity ของอุปกรณ์มือถือที่เชื่อมต่อใน Network มาได้ จะทำให้เราเช็คได้ว่า ถ้ามือถือเครื่องนี้ต่อ Wifi อยู่แสดงว่าอยู่บ้าน &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(จริงๆแค่ track จาก Location ใน App มือถืออันเดียวก็เพียงพอแล้ว แค่ผมเอา entity จาก MikroTik มา track เพิ่มเพื่อความแม่นยำ)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;มาสร้าง Node-RED Workflow กันเลยดีกว่าครับ&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpusfn6czgh7m4k06jt54.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpusfn6czgh7m4k06jt54.png" alt="Node-RED 1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1.เริ่มจากสร้าง events: state มาเช็ค state ของ person ที่ต้องการติดตาม ดูว่าถ้าไม่อยู่บ้าน (not_home) ก็ให้ทำ Node ถัดไป&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19e75vp70cv3n0f3lk9h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19e75vp70cv3n0f3lk9h.png" alt="Node 1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.เพิ่ม delay หน่วงเวลาไป 1 ชั่วโมง&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F201hiotvnkjbbszdo7ti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F201hiotvnkjbbszdo7ti.png" alt="Node 2"&gt;&lt;/a&gt;&lt;br&gt;
จะตั้งเวลาเท่าไรนั้น ขึ้นอยู่กับความเหมาะสมครับ เช่นอย่างของผมตั้งเวลาไว้เผื่อเดินไปเซเว่นใกล้บ้านแล้วกลับมาไม่เกิน 1 ชั่วโมง &lt;/p&gt;

&lt;p&gt;3.หลังจาก ครบ 1 ชั่วโมงแล้ว เช็ค current state ดูว่าถ้าหาก state ยังขึ้นเป็น not_home ก็ให้ทำ Node ถัดไป&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43dlazk9xmpo6a5ayhmt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43dlazk9xmpo6a5ayhmt.png" alt="Node 3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9zh3cmki5fgp1a1wyhp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9zh3cmki5fgp1a1wyhp.png" alt="Node-RED 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.หลังจากนั้นเช็ค current state ของแอร์ว่ายังเปิดอยู่ไหม ถ้าแอร์ยังเปิดอยู่ก็ให้ทำ Node ถัดไป&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ud1wajx7puqvlsjjub7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ud1wajx7puqvlsjjub7.png" alt="Screen Shot 2564-06-20 at 03.13.39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.หลังจากเช็คว่าถ้าแอร์ยังเปิดอยู่ ก็ทำการ call service สั่งให้ปิดแอร์ &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzemf5mppe5jyn8zbk8m6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzemf5mppe5jyn8zbk8m6.png" alt="Screen Shot 2564-06-20 at 03.16.17"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.ทำการ call service notify เพื่อทำการแจ้งเตือนในแอพ Home Assistant ว่า "ดำเนินการปิดแอร์ให้แล้วเนื่องจากคุณลืมปิดแอร์"&lt;br&gt;
(ขั้นตอนนี้อาจจะปรับเปลี่ยนไปใช้เป็น LINE Notify หรือ Notify อื่นๆก็ได้นะครับ)&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbwgih3o3wj8xbhpw9mm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbwgih3o3wj8xbhpw9mm.png" alt="call service notify"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ตัวอย่าง Data สำหรับ notify &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41p1m5huxe4px60xxadd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41p1m5huxe4px60xxadd.png" alt="JSON Data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ดูข้อมูลเพิ่มเติมสำหรับการส่ง notify ได้ที่ &lt;br&gt;
&lt;a href="https://www.home-assistant.io/integrations/notify/" rel="noopener noreferrer"&gt;https://www.home-assistant.io/integrations/notify/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;หลังจากนี้เมื่อออกจากบ้านและลืมปิดแอร์ภายใน 1 ชั่วโมงก็จะมี Notification แจ้งเตือนในมือถือและ Node-RED ก็จะสั่งปิดแอร์ให้เราอัตโนมัติ&lt;/p&gt;

&lt;p&gt;หน้าตา Notification จากแอพ Home Assistant ในมือถือ&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvwdhxjx7brzqpaltp8h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvwdhxjx7brzqpaltp8h.png" alt="Notification"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nodered</category>
      <category>hassio</category>
      <category>homeassistant</category>
    </item>
    <item>
      <title>วิธีใช้งาน Broadlink RM + SmartIR ใน Home Assistant เพื่อควบคุมเครื่องปรับอากาศ</title>
      <dc:creator>Pattanapong Cherthong</dc:creator>
      <pubDate>Fri, 18 Jun 2021 22:31:47 +0000</pubDate>
      <link>https://dev.to/teampat/broadlink-rm-smart-ir-home-assistant-2l5c</link>
      <guid>https://dev.to/teampat/broadlink-rm-smart-ir-home-assistant-2l5c</guid>
      <description>&lt;p&gt;ต้องยอมรับเลยว่าถ้าจะใช้งาน SmartIR ใน Home Assistant ก่อนหน้านี้ถือว่ามืดมนเลยก็ว่าได้ มักจะไปต่อกันไม่ถูก เพราะคนทำ SmartIR ก็ไม่ได้มี Document หรือ Tutorial ให้อ่านอย่างละเอียดว่าต้องตั้งค่าทำอะไรบ้างตั้งแต่ต้นจนจบ ซึ่งใน Github ก็บอกไว้แค่คร่าวๆมากและดูงงๆ กว่าจะใช้งานได้จริงๆก็เสียเวลาหาวิธีอยู่นาน หาใน Community บ้าง ใน YouTube บ้าง ลองงมลองเล่นเองและถามเพื่อนๆที่เคยเซ็ตไว้ได้ ก็เลยอยากเอามาเขียนสรุปไว้เผื่อจะเป็นประโยชน์กับใครที่ต้องการใช้งาน SmartIR ใน Home Assistant ครับ&lt;/p&gt;

&lt;p&gt;โดยปกติแล้วถ้าหากเราใช้งาน Broadlink RM ใน Home Assistant สามารถทำได้โดยการ Learn IR codes เป็นการเรียนรู้คำสั่งจากรีโมทของเครื่องใช้ไฟฟ้าต่างๆ มาเก็บไว้ใน Home Assistant และสามารถเลือกคำสั่ง IR codes ที่ได้จากการ Learn มาสั่งงานเครื่องใช้ไฟฟ้าได้เลยตรงๆ ดูเหมือนจะง่ายใช่ไหมครับ แต่ในความเป็นจริงถ้าหากเป็นรีโมทของเครื่องปรับอากาศ(ต่อไปนี้ขอเรียกสั้นๆว่า แอร์) จะมีคำสั่งบรรจุอยู่ในนั้นเยอะมากๆ &lt;br&gt;
ซึ่งหลักการทำงานของรีโมทแอร์ส่วนใหญ่จะมีการมัดรวมการตั้งค่าต่างๆหลายๆค่าไว้ในคำสั่งเดียว เช่น สั่งให้แอร์ ยี่ห้อ Daikin รุ่น FTE09NV25 มีอุณหภูมิที่ 25 องศา C กับความแรงลมที่ level 5 และ swing mode เปิดอยู่ในโหมด cool หรือ dry หรือบางรุ่นบางยี่ห้อในต่างประเทศอาจจะมีโหมด heat ด้วย สามารถทำหน้าที่เป็น heater ปรับให้อุณภูมิในห้องร้อนขึ้นได้เมื่อเจออากาศหนาวๆ &lt;/p&gt;

&lt;p&gt;ใน 1 คำสั่งจะมัดรวมการตั้งค่าทุกอย่างไว้ใน IR codes เก็บข้อมูลไว้ใน Home Assistant ลักษณะแบบนี้ (ถ้าใครเป็น Dev จะเข้าใจว่ารูปแบบนี้คือ base64)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JgBMAadEDjgOFQ0VDRYNOQ0VDRYNFQ0WDTkNFQ05DTkNFg04DjgOOA44DjgOFQ0VDTkNFg0VDRYNFQ0WDRUNOQ05DTkNOQ05DRUOOA44DhUNFQ0WDRUNFg0VDRYNFQ0WDRUNFg0VDTkNOQ05DTkNFQ4VDRUOFQ0AA8WnRQ05DRUNFg0VDTkNFg0VDRYNFQ05DRUOOA44DhUNOQ05DTkNOQ05DRUNFg05DRUNFg0VDRYNFQ0VDhUNFQ4VDRUOOA44DhUNFQ05DRYNOQ05DTgOFQ0WDRUNOQ05DRUOFQ05DRUOFQ0VDjgNFg0VDRYNFQ0WDRUNFg0VDRYNFQ0WDRUNFg0VDRYNFQ0WDRUNFg0VDTkNOQ05DTkNFQ4VDRUNOQ44DTkNFg0VDRYNFQ0WDRUNFg0VDTkNFQ4VDRUOFQ0VDhUNOQ0VDTkNFg05DRUNAA0FAAAAAAAAAAAAAAAA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ถ้าหากเราตั้งอุณหภูมิแตกต่างกันไปตั้งแต่ 19-30 องศา C หรือ ความแรงลม ตั้งแต่ระดับ 1 - 5 หรือตั้งเป็น auto เท่านี้ลองคิดรวมๆกันจะต้องเก็บคำสั่งไว้เป็นร้อยๆคำสั่ง &lt;/p&gt;

&lt;p&gt;แต่ถ้าหากเราต้องการสั่งงานให้ปรับแค่อุณหภูมิแอร์มาที่ 25 เท่านั้นปกติแล้วไม่สามารถทำได้ ต้องมาเลือกคำสั่งว่า 25 องศา C ที่ความแรงลมเท่าไร ในโหมดไหน cool หรือ dry ใช้ swing mode ด้วยไหม แบบนี้ดูจะใช้งานยากไปหน่อย&lt;/p&gt;

&lt;p&gt;SmartIR ก็เป็นอีกหนึ่งตัวช่วยที่จะมาช่วยจัดการคำสั่งรีโมทแอร์ให้ใช้งานได้ง่ายขึ้น สามารถปรับอุณหภูมิหรือปรับแรงลมแยกกันได้สะดวก (เบื้องหลังก็คือจะไปหยิบคำสั่งที่เราเก็บไว้เป็นร้อยๆคำสั่งมาสั่งงานให้เรานั่นแหละครับ)&lt;br&gt;
และนอกจากนั้น Home Assistant จะมองเครื่องปรับอากาศเครื่องที่เราเก็บคำสั่งไว้ เห็นเป็น entity หนึ่ง ไม่ได้มองเป็นคำสั่งร้อยๆชุดแบบเดิม&lt;/p&gt;
&lt;h2&gt;
  
  
  วิธีการเพิ่ม Broadlink RM ใน HA และการ Learn Command
&lt;/h2&gt;

&lt;p&gt;1.เพิ่ม Broadlink RM เข้ามาใน integrations ก่อน (รองรับ RM3,RM4 ทั้ง mini และไม่ mini)&lt;br&gt;
2.มาที่ Developer Tools &amp;gt; Service เพื่อ Learn Command &lt;br&gt;
3.เลือก Service เป็น Remote: Learn Command&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlmh09ir7w6u4jj3m7z0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlmh09ir7w6u4jj3m7z0.png" alt="Screen Shot 2564-06-19 at 00.54.53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ใส่ attribute ดังนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;remote.learn_command&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;device&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;air_conditioner&lt;/span&gt;
  &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cool_1_19&lt;/span&gt;
&lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;entity_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;remote.rm3_mini_remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;service&lt;/td&gt;
&lt;td&gt;remote.learn_command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;device&lt;/td&gt;
&lt;td&gt;ใส่ชื่ออุปกรณ์หรือเครื่องใช้ไฟฟ้าที่จะรับคำสั่งเข้ามา&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;command&lt;/td&gt;
&lt;td&gt;ใส่ชื่อคำสั่ง ตัวอย่างเช่น ปรับแอร์มาที่ 19 องศา ความแรงลมคือ 1 ตั้งชื่อเป็น cool_1_19 (จะตั้งชื่อยังไงก็ได้ขอให้ตัวเองเข้าใจ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;entity_id&lt;/td&gt;
&lt;td&gt;ใส่ entity id ของ Boardlink&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;4.คลิกปุ่ม CALL SERVICE จะมี Notification แจ้งเตือนใน Home Assistant และที่ Boardlink RM จะมีไฟ LED ติดอยู่&lt;br&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukuj7w2qxmhbriq1kxnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukuj7w2qxmhbriq1kxnv.png" alt="Screen Shot 2564-06-19 at 03.54.32"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb3rnf4m56ugvyu2so4q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb3rnf4m56ugvyu2so4q.jpg" alt="RM3 Mini LED On"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.เอารีโมทชี้มาที่ Boardlink RM และกดปุ่มที่ต้องการ เมื่อ Learn สำเร็จแล้ว Notification จะหายไป และไฟ LED ที่ Broadlink RM ก็จะดับเช่นกัน&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nwnqqmlageyre4owb28.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nwnqqmlageyre4owb28.jpg" alt="RM3 Mini LED Off"&gt;&lt;/a&gt;&lt;br&gt;
6.ทำขั้นตอนที่ 3-5 รับคำสั่งรีโมททุกคำสั่งให้ครบหรือจนกว่าจะพอใจ&lt;/p&gt;

&lt;p&gt;7.ใช้ Visual Studio Code เปิดเข้ามายังโฟลเดอร์ /config/.storage/&lt;br&gt;
(File &amp;gt; Open Folder)&lt;br&gt;
จะมีไฟล์ที่ชื่อว่า broadlink_remote_xxxxx_codes ขึ้นมา ข้างในจะบรรจุคำสั่งที่เราเคยได้ Learn ไว้ มาถึงขั้นตอนนี้พักหายใจกันก่อน&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5jqdlkr84kjuw1c62bv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5jqdlkr84kjuw1c62bv.png" alt="Screen Shot 2564-06-19 at 01.04.58"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ติดตั้งและใช้งาน SmartIR
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;ติดตั้ง HACS ดูวิธีติดตั้งได้ใน Link นี้
&lt;a href="https://hacs.xyz/docs/installation/installation/" rel="noopener noreferrer"&gt;https://hacs.xyz/docs/installation/installation/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ติดตั้ง SmartIR ใน HACS ด้วยการเพิ่ม custom repository
&lt;a href="https://github.com/smartHomeHub/SmartIR" rel="noopener noreferrer"&gt;https://github.com/smartHomeHub/SmartIR&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;หลังจากที่ติดตั้ง SmartIR แล้วให้เข้ามาดูรายชื่อเครื่องปรับอากาศว่ามีรุ่นที่ใช้งานอยู่ใน List นี้หรือไม่
&lt;a href="https://github.com/smartHomeHub/SmartIR/blob/master/docs/CLIMATE.md" rel="noopener noreferrer"&gt;https://github.com/smartHomeHub/SmartIR/blob/master/docs/CLIMATE.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;4.1 ถ้ามี ให้โหลดไฟล json จาก Github มาใช้ได้เลย ตามรุ่นเครื่องปรับอากาศที่เรามี มาใส่ไว้ในโฟลเดอร์ /config/custom_components/smartir/codes/climate&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyckbbt5sg8w928x2my1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyckbbt5sg8w928x2my1g.png" alt="Screen Shot 2564-06-19 at 02.10.10"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.2 ถ้าไม่มีรุ่นแอร์ใน list ให้สร้างไฟล์ขึ้นมาใหม่ เช่น xxxx.json ไว้ในโฟลเดอร์ตามข้อ 4.1 โดยหาไฟล์ .json สักไฟล์จาก &lt;a href="https://github.com/smartHomeHub/SmartIR/blob/master/docs/CLIMATE.md" rel="noopener noreferrer"&gt;link&lt;/a&gt; ในข้อ 3 มาเป็นต้นแบบ&lt;br&gt;
อยากให้ลองศึกษารูปแบบของค่าต่างๆในไฟล์ดูนะครับ(ไม่ขออธิบายตรงนี้ละกันครับน่าจะยาว) แล้วแทนที่ IR codes ที่เราได้ Learn ไว้แล้ว (จากไฟล์ broadlink_remote_xxxxx_codes)&lt;br&gt;
หมายเหตุ: การตั้งชื่อไฟล์ xxxx.json จะใช้เป็น code ตัวเลข 4 ตัว (และจะต้องไม่ซ้ำกับที่มีอยู่แล้ว ถ้าหากเราจะ contribute เพิ่มคำสั่งแอร์ของเราไว้ใน Github ด้วย) &lt;/p&gt;

&lt;p&gt;5.เพิ่ม smartir: และ climate: ในไฟล์ configuration.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;smartir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;climate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;smartir&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Daikin AC&lt;/span&gt;
    &lt;span class="na"&gt;unique_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;daikin_ac&lt;/span&gt;
    &lt;span class="na"&gt;device_code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1111&lt;/span&gt;
    &lt;span class="na"&gt;controller_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;remote.rm3_mini_remote&lt;/span&gt;
    &lt;span class="na"&gt;temperature_sensor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sensor.0x00124b00226b2946_temperature&lt;/span&gt;
    &lt;span class="na"&gt;humidity_sensor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sensor.0x00124b00226b2946_humidity&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;
&lt;td&gt;ให้ตั้งชื่อแอร์&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;unique_id&lt;/td&gt;
&lt;td&gt;unique_id อันนี้จะเป็น entity ของแอร์&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;device_code&lt;/td&gt;
&lt;td&gt;ใส่ code ตามชื่อไฟล์ในข้อ 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;controller_data&lt;/td&gt;
&lt;td&gt;ใส่ entity id ของ Boardlink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;temperature_sensor&lt;/td&gt;
&lt;td&gt;(ถ้ามี) sensor อุณหภูมิก็ใส่ entity id ของ sensor ด้วย&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;humidity_sensor&lt;/td&gt;
&lt;td&gt;(ถ้ามี) sensor ความชื้นก็ใส่ entity id ของ sensor ด้วย&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;6.สุดท้ายลองสร้าง Lovelace ในแบบ Thermostat Card ใส่ entity ของแอร์ที่เคยตั้งค่า unique_id ไว้ในข้อ 5 จะได้เป็น climate.daikin_ac&lt;br&gt;
ลองสั่งคำสั่งแอร์เปลี่ยนอุณหภูมิปรับแรงลม ถ้าแอร์มีการตอบสนองถือว่าสำเร็จแล้วครับ&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybv0wcu8p8rq0hhp08fw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybv0wcu8p8rq0hhp08fw.png" alt="Screen Shot 2564-06-19 at 05.23.11"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hassio</category>
      <category>homeassistant</category>
      <category>broadlink</category>
      <category>smartir</category>
    </item>
    <item>
      <title>วิธีการติดตั้ง Cloudflare Argo Tunnel ใน Home Assistant</title>
      <dc:creator>Pattanapong Cherthong</dc:creator>
      <pubDate>Sat, 24 Apr 2021 22:04:59 +0000</pubDate>
      <link>https://dev.to/teampat/cloudflare-argo-tunnel-home-assistant-1l33</link>
      <guid>https://dev.to/teampat/cloudflare-argo-tunnel-home-assistant-1l33</guid>
      <description>&lt;p&gt;สวัสดีครับ บทความนี้จะมาแนะนำวิธีการใช้งาน Cloudflare Argo Tunnel ใน Home Assistant ครับ&lt;br&gt;
ขออธิบายก่อนครับ โดยทั่วไปแล้วถ้าเราจะตั้ง server จากที่บ้านหรือสำนักงานและสามารถเข้าถึงได้จากอินเตอร์เน็ตจะต้องเข้าถึงด้วย Public IP แต่ปัจจุบันผู้ให้บริการอินเตอร์เน็ต (ISP) จะไม่ได้แจก Public IP ให้กับผู้ใช้บริการทั่วไปแล้ว ส่วนมากจะได้เป็น private ip ที่อยู่หลัง NAT อีกที แต่อาจทดแทน ด้วยการเปิด port ให้เข้าถึงผ่านทาง ddns ของ ISP แต่ก็ไม่สามารถใช้งาน web server ผ่านทาง port ปกติอย่างเช่น 80 และ 443 ได้ &lt;/p&gt;

&lt;p&gt;สำหรับ Home Assistant โดยปกติแล้วถ้าเข้าถึงใน local network ก็จะต้องใช้งานผ่าน port 8123 ใช่ไหมหละครับ แต่ถ้าจะเข้าถึงได้ทางอินเตอร์เน็ตและ&lt;br&gt;
ถ้าต้องการเข้าถึงโดย link ที่เป็น https อาจจะต้องใช้ reverse proxy เข้ามาช่วยเพื่อที่จะเข้าใช้งานใน https ใน port 443 อีกทั้งยังต้องมี SSL Certificate ที่อาจจะต้องเช่าไว้รายปี หรือจะใช้ Let's Encrypt ที่เป็น Free SSL ผูกเข้าไปด้วย&lt;br&gt;
แต่มีอีกหนึ่งตัวเลือกที่สะดวกมากๆไม่ต้องทำอะไรมากก็คือใช้งานผ่าน Cloudflare Argo Tunnel เป็นการเชื่อมต่อ tunnel ไปยัง server ของ cloudflare ตรงๆโดยไม่ต้องใช้ Public IP ซึ่งถ้าหากใครเคยใช้งาน ngrok.com ก็คือมีจะมีหลักการคล้ายๆกันนี่แหละครับ และที่สำคัญคือ Cloudflare Argo Tunnel ตอนนี้เปิดให้ใช้งานได้ฟรี &lt;/p&gt;

&lt;p&gt;สิ่งสำคัญที่จะต้องมีก่อนใช้งาน Cloudflare Argo Tunnel ก็คือจะต้องมี domain name ที่ผูกกับ cloudflare ไว้แล้ว ซึ่งถ้าหากใครยังไม่มีจะต้องจด domain name กับผู้ให้บริการต่างๆแล้วมาผูกกับ cloudflare ก่อนครับ&lt;/p&gt;

&lt;p&gt;เริ่มจากเราจะต้อง setup tunnel ในคอมพิวเตอร์ก่อน เพื่อที่จะเอา config ต่างๆไปตั้งค่าใน Home Assistant อีกที &lt;br&gt;
ขั้นตอนแรกให้ติดตั้ง cloudflared &lt;a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation" rel="noopener noreferrer"&gt;Link นี้&lt;/a&gt;&lt;br&gt;
มีให้ใช้งานทั้งใน Windows, Mac และ Linux ส่วนการใช้งาน cloudflared จะเป็นการใช้งานใน Terminal หรือถ้าใน Windows ก็จะเรียกใช้ได้ใน PowerShell หรือ CMD ก็ได้&lt;/p&gt;

&lt;p&gt;ทำการ login cloudflare ด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudflared tunnel login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiv0hvalo2qv0vyxka8m2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiv0hvalo2qv0vyxka8m2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
จะเด้งเข้า Browser ให้เพื่อเรา Login cloudflare &lt;br&gt;
หรือถ้าไม่เด้งเข้า Browser อัตโนมัติ ก็อาจจะต้องก๊อป Link ไปเปิด browser เองนะครับ&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flsirze9y5qkwmsz4x1v2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flsirze9y5qkwmsz4x1v2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;หลังจากนั้นให้เลือกโดเมนเนมที่เราต้องการผูกกับ Tunnel&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyszhu7h98ubs89puc9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyszhu7h98ubs89puc9q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;กดปุ่ม Authorize เป็นอันเสร็จขั้นตอน Login&lt;/p&gt;

&lt;p&gt;หลังจากนั้นสร้าง tunnel ด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudflared tunnel create &amp;lt;NAME&amp;gt;

//แทนที่ &amp;lt;NAME&amp;gt; ด้วยชื่อ tunnel ที่ต้องการ

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจากที่สร้าง tunnel แล้วก็จะได้ไฟล์ {UUID}.json ถูกสร้างขึ้นมา&lt;/p&gt;

&lt;p&gt;สำหรับ Mac หรือ Linux จะอยู่ใน path นี้ครับ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.cloudflared/{UUID}.json 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สำหรับใน Windows จะอยู่ใน path นี้ครับ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Users\xxxx\.cloudflared\{UUID}.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ใช้คำสั่ง cloudflared tunnel list เพื่อดู tunnel ที่ได้สร้างไว้&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1ge3vklenfkz402x38j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1ge3vklenfkz402x38j.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;หลังจากท่ีสร้าง tunnel แล้วเราจะได้ Link ของ tunnel ภายใต้ subdomain&lt;br&gt;
TUNNELID.cfargotunnel.com &lt;br&gt;
(แทนที่ TUNNELID ด้วย UUID ของเรา)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ต่อไปคือตั้งค่า DNS record (มี 2 วิธี)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;วิธีที่ 1&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เข้าไปตั้งค่า DNS ในเว็บ Cloudflare&lt;/li&gt;
&lt;li&gt;สร้าง CNAME record และใส่ Link tunnel เข้าไปใน Target พร้อมด้วย subdomain ที่ต้องการในช่อง Name&lt;/li&gt;
&lt;li&gt;กด Save เป็นอันเสร็จ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1j53rdeorpv780qbe7ct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1j53rdeorpv780qbe7ct.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;วิธีที่ 2&lt;br&gt;
ตั้งค่า DNS ด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudflared tunnel route dns &amp;lt;UUID or NAME&amp;gt; sub.domain.com

//แทนที่ &amp;lt;UUID or NAME&amp;gt; ด้วย tunnel id หรือ ชื่อ tunnel 
//แทนที่ sub.domain.com ด้วย domain name ที่ต้องการ

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ขั้นตอนต่อไป ให้เข้ามายัง Home Assistant &amp;gt; Supervisor &amp;gt; Add-on Store&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyepkexsje6llr0un0jfh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyepkexsje6llr0un0jfh.png" alt="Supervisor-Home-Assistant"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เพิ่ม repository นี้เข้าไป&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/PanJ/hassio-addons
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะมี Cloudflare Argo Tunnel ขึ้นมาให้ติดตั้ง&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkz48s9n32jgzejbeyfj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkz48s9n32jgzejbeyfj.png" alt="Supervisor-Home-Assistant (2)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojvnsk2ljrexkbv3eewr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojvnsk2ljrexkbv3eewr.png" alt="Supervisor-Home-Assistant (4)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;หลังจากติดตั้ง add-on แล้วให้สร้างไฟล์ config.yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tunnel: { UUID }
credentials-file: /etc/cloudflared/credentials.json
ingress:
  - hostname: { hostname }
    service: http://127.0.0.1:8123
  - service: http_status:404
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แทนที่ { UUID } ด้วย tunnel id&lt;br&gt;
แทนที่ { hostname } ด้วย domain name ที่ผูกไว้กับ cloudflare  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ตัวอย่างไฟล์ config.yml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tunnel: 139b5cc8-de94-48ae-99e5-xxxxxxxxxxxx
credentials-file: /etc/cloudflared/credentials.json
ingress:
  - hostname: home.teamteam.cloud
    service: http://127.0.0.1:8123
  - service: http_status:404
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;สุดท้ายท้ายสุดทำการตั้งค่าใน Add-on Cloudflare Argo Tunnel&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;convert config.yml ให้เป็น base64 ด้วยคำสั่ง  (สำหรับ Mac หรือ Linux)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat config.yml | base64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แต่สำหรับ Windows อาจจะต้องไปใช้เว็บ &lt;a href="http://www.base64encode.org" rel="noopener noreferrer"&gt;www.base64encode.org&lt;/a&gt; ในการ convert ให้เป็น base64&lt;/p&gt;

&lt;p&gt;2.ให้ copy ข้อมูลข้างในไฟล์ {UUID}.json และ base64 string ในข้อ 1 ไปใส่ใน Configuration&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgi25j2wr8fy1kvx5x2i9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgi25j2wr8fy1kvx5x2i9.png" alt="Supervisor-Home-Assistant (5)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.ตั้งแต่ Home Assistant เวอร์ชั่น 2021.07 เป็นต้นไป จะต้องเข้าไปเพิ่ม http config ใน configuratio12n.yaml ด้วยครับ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http:
  use_x_forwarded_for: true
  trusted_proxies:
   - 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;อาจจะเข้าใจยากหน่อย จะต้องมีความเข้าใจพื้นฐานเรื่องระบบ Network ด้วยครับ&lt;br&gt;
ค่าที่จะเป็นต้องใส่ก็คือ use_x_forwarded_for และ trusted_proxies&lt;br&gt;
ใน trusted_proxies ให้ใส่ ip address ฝั่งที่เป็น gateway ที่ทำให้เราเข้า Home Assistant จาก Internet ได้&lt;br&gt;&lt;br&gt;
อย่างในที่นี้คือ เราใช้ add-on cloudflare tunnel ซึ่งทำงานอยู่ใน Home Assistant ซึ่งแน่นอน ในทาง Network มันคือ localhost หรือ 127.0.0.1 ใน trusted_proxies ก็จะต้องใส่ 127.0.0.1 หรือ ::1 ก็ได้ หรือถ้าใครทำ forward port ไว้จาก ฑouter ก็เอา ip ของ Router มาใส่เพิ่มได้&lt;/p&gt;

&lt;p&gt;เสร็จแล้ว ให้กด start ที่ Add-on Cloudflare Argo Tunnel เพียงเท่านี้เราจะสามารถเข้าถึง Home Assistant ของเราได้จากข้างนอกผ่านทางโดเมนที่เราผูกไว้กับ cloudflare อีกทั้งเรายังได้ SSL ฟรีๆจาก cloudflare อีกด้วย สามารถเข้าเว็บด้วย https ได้ทันที สามารถนำไปเชื่อมต่อกับ Google Assistent ได้เลย โดยไม่ต้องพึ่ง Nabu Casa Cloud&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxci62172ntuvum7zygh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxci62172ntuvum7zygh.png" alt="Screen Shot 2564-04-25 at 03.32.17"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
