Posted on

อัพเดท Cloudflare DNS IP Address ด้วย Python ใน Raspberry Pi

หลายคนที่กำลังใช้เน็ตบ้านทำ Server หรืออุปกรณ์ IOT ส่วนใหญ่จะเจอปัญหาคือ Public IP Address จะเปลี่ยนไปในทุกๆ วัน ทำให้ยากต่อการบริหารจัดการ วันนี้เรามีเคล็ดลับดีๆ มาฝากกัน คือการ อัพเดท Cloudflare DNS IP Address ด้วย Python ใน Raspberry Pi ซึ่งก่อนอื่นนั้นมาดูขั้นตอนที่เราต้องทำกันก่อน

  1. ทำการชี้โดเมนเนมของเราไปใช้บริการ DNS Service ของ Cloudflare ให้เรียบร้อย
  2. ให้ทำการสร้าง DNS A record ขึ้นมา 1 ชื่อ เช่น home.mydomain.com
  3. หลังจากนั้นเราจะทำการเขียน Script Python (โค้ดอยู่ด้านล่าง) ให้ทำการอัพเดท IP Address ของเน็ตในบ้าน ให้กับ home.mydomain.com
  4. ตั้ง Cron job ให้ทำการการ Run script นี้เป็นระยะๆ
  5. ต่อไปก็สามารถเรียกใช้งานมายังอุปกรณ์หรือระบบในบ้านผ่าน home.mydomain.com ได้ตลอดไป

สำหรับตัวอย่างโค้ดก็สามารถดูได้จากตัวอย่างนี้เลยนะครับ ในส่วนของการใช้งาน หลังจากกำหนดค่าตัวแปรต่างๆ เสร็จให้ทำการรันโค้ด 1 ครั้งก่อน เพื่อหาค่า RECORD_ID ของ dns record ที่เราจะทำการอัพเดท IP เมื่อได้ค่า id มาแล้ว ก็เอามาใส่ให้กับตัวแปร RECORD_ID ได้เลยครับ

#!/usr/bin/env python
import requests
import json
import sys 

IP_API = 'https://api.ipify.org?format=json' #อ่านค่า Public IP ของเน็ตที่กำลังใช้งานอยู่
CF_API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  #ค่า Global API Key เอาจาก Cloudflare ตรงเมนู 'My Profile'
CF_EMAIL = 'xxxxxx@myemail.com'    #อีเมล์ที่เป็น Username ของ Cloudflare
ZONE_ID = '111xxxxxxxxxxxxxxxxxxxxxx'  #ดูจากหน้า Dashboard ของโดเมนเนม ใน Cloudflare
RECORD_ID = ''  ##ค่า RECORD_ID นี้ให้ทำการรัน Script ก่อน 1 ครั้ง จากนั้นระบบจะแสดงผล เป็นชื่อ dns name ที่เราสร้างไว้ใน DNS ของ Cloudflare ให้คัดลองตรง "id": "xxxxxxx"  มาใส่


if not RECORD_ID:
    resp = requests.get(
        'https://api.cloudflare.com/client/v4/zones/{}/dns_records'.format(ZONE_ID),
        headers={
            'X-Auth-Key': CF_API_KEY,
            'X-Auth-Email': CF_EMAIL
        })
    print(json.dumps(resp.json(), indent=4, sort_keys=True))
    print('Please find the DNS record ID you would like to update and entry the value into the script')
    sys.exit(0)

resp = requests.get(IP_API)
ip = resp.json()['ip']


resp = requests.put(
    'https://api.cloudflare.com/client/v4/zones/{}/dns_records/{}'.format(
        ZONE_ID, RECORD_ID),
    json={
        'type': 'A',
        'name': 'myname.myweb.com',
        'content': ip,
        'proxied': False
    },
    headers={
        'X-Auth-Key': CF_API_KEY,
        'X-Auth-Email': CF_EMAIL
    })
assert resp.status_code == 200

print('Updated dns record for {}'.format(ip))

โค้ดนี้ดัดแปลงมาจากลิ้งค์นี้นะครับ

https://www.nathanvangheem.com/posts/2018/07/15/auto-update-cloudflare-dns.html

อย่าลืมกดติดตามเราใน Page https://www.facebook.com/iot.pf นะครับ เราจะลงบทความบ่อยๆ

Posted on

Python ส่งไฟล์ภาพจากในเครื่องของเราไปยัง Line Notify

Post นี่สำหรับคนที่กำลังฝึกเขียน Python ลองนำไปเล่นกันได้เลยครับ เป็นโค้ดง่ายๆ สำหรับการส่งไฟล์ภาพจากในเครื่องของเราไปยัง Line Notify

Source: https://github.com/jpnetwork/Python-Line-Local-Image

Posted on

PHP ส่งข้อความไปยัง LINE Notify พร้อมไฟล์ภาพที่อยู่ใน Local Disk

ใครที่ทำระบบและต้องการส่งข้อความไปยัง LINE Notify เพื่อแจ้งเตือน สามารถเอา Script นี้ไปใช้งานได้เลยครับ โดยสามารถส่งข้อความ, สติกเกอร์ และไฟล์ภาพ จากเครื่องของเราเอง เข้าไปยัง Line ได้ทันที โดยสิ่งที่แตกต่างจาก Script ที่แจกกันอยู่ทั่วไปๆ นั้นคือ ไฟล์ภาพจะเป็นไฟล์ที่อยู่ใน local disk ของเราเอง ไม่ใช่การดึงภาพมาจาก URL ที่อยู่ในอินเตอร์เน็ตอยู่แล้วนั่นเอง

สำหรับในส่วนโค้ด PHP สามารถไปดูได้จาก https://github.com/jpnetwork/PHP-LINE-Local-image

Posted on

ปรับแต่ง Arduino IDE ให้เป็น Dark Theme กันเถอะ

สำหรับบทความนี้ก็คงจะถูกใจขา IOT DEV ที่ชอบทำงานภายใต้ Dark Theme กันพอสมควร เนื่องจากเราจะทำการแปลงโฉม Arduino IDE ให้เป็น Dark Theme อันดับแรกไป Download เจ้า Dark Theme กันก่อนที่ https://github.com/konrad91/OneDarkArduino เมื่อโหลดเสร็จให้ทำการ Exract ZIP ไฟล์ (OneDarkArduino-master.zip) ออกมาจะได้โฟลเดอร์ OneDarkArduino-master ที่ด้านในจะมีโฟลเดอร์ theme อยู่ครับ

ให้ทำการ Copy โฟลเดอร์ theme ไปใส่ในที่อยู่ของ Arduino IDE ในเครื่องของเรา หากใช้งาน Windows ก็จะอยู่ที่ C:\Program Files (x86)\Arduino\lib สำหรับสาวก Mac ~/Applications/Arduino.app/Contents/Java/lib ส่วนใครที่ใช้งาน Linux ก็ไปวางที่ /usr/share/arduino/lib/

โดยก่อนที่จะ Copy โฟลเดอร์ theme ใหม่ไปวางนั้น ควรทำการลบ โฟลเดอร์ theme เดิมทิ้ง หรือในกรณีที่ต้องการกลับไปใช้งานก็ควรเปลี่ยนชื่อโฟลเดอร์ theme เป็นชื่ออื่นไปก่อนครับ

หลังจากนั้นให้ทำการเปิดโปรแกรม Arduino IDE ก็จะพบกับ Dark Theme ซึ่งหลายๆ คน ชอบใช้งานเนื่องจากทำให้รู้สึกสบายสายตาตอนที่เขียน Code นั่นเองครับ

Posted on

กราฟข้อมูล COVID-19 ดึงจาก API ของกรมควบคุมโรค

ทางกรมควบคุมโรค กระทรวงสาธารณสุข ออก API เกี่ยวกับ Covid-19 ให้สามารถเข้าไปดึงข้อมูลมาพัฒนาต่อได้ ดูรายละเอียดได้จากลิ้งนี้ https://covid19.th-stat.com/th/api เลยลองเขียน PHP ดึงค่ามาลงในกราฟดูหน่อย ใครอยากเอาไปเล่นต่อ ไปเอาโค้ดได้ที่นี่ครับ https://github.com/jpnetwork/Covid-19-Graph

Posted on

PHP ฟังชั่นแปลงตัวเลขจำนวนเงินเป็นตัวอักษร

พักเรื่อง IOT มาเขียน PHP กันบ้างดีกว่า สำหรับวันนี้จะแนะนำ ฟังชั่น PHP สำหรับ แปลงตัวเลขจำนวนเงินเป็นตัวอักษร  เหมาะสำหรับคนที่กำลังทำ Project เกี่ยวกับเรื่อง เงินๆ ทอง ๆ เช่น ในใบเสร็จรับเงิน ใบแจ้งชำระ มาใช้ฟังชั่นนี้ได้เลย เพราะมันจะแปลงค่าตัวเลข (เงิน) ใ้ห้เป็นข้อความโดยอัตโนมัติ ลองดูโค้ดได้จาก https://github.com/jpnetwork/PHP-Thaibaht

Posted on

ทำไฟ built-in LED ให้กระพริบ ด้วย ESP8285

ตัวบอร์ด ESP8285 จะมี built-in LED  ที่เชื่อมต่ออยู่กับขา Digital Pin 16 ดังนั้น Post นี้เราจึงมาลองทำไฟกระพริบ (Blink) โดยไม่ต้องต่ออุปกรณ์เพิ่มเติมอะไรเลย

มาดูตัวอย่างโค้ดกัน (อย่าลืมกดปุ่ม FLASH ตอนที่ทำการอัพโหลด)

int MYLED = 16;

void setup() {
  pinMode(MYLED, OUTPUT);
}


void loop() {
  digitalWrite(MYLED, HIGH);   
  delay(500);                      
  digitalWrite(MYLED, LOW);    
  delay(300);                   
}

ไม่ยากใช่มั้ยละ ถ้าทำได้แล้วลอง ปรับค่า delay ให้ เร็วหรือช้าลง ตามความต้องการดูนะครับ

Posted on

ESP8285 ทำการ Query ข้อมูลจาก Mysql Database

สวัสดีครับ บทความนี้จะมาแนะนำการ Query ข้อมูลจาก MySQL Database มีวัตถุประสงค์คือการให้ บอร์ด ESP8285 สามารถทำการ Select ข้อมูลจากฐานข้อมูล MySQL ตามเงื่อนไขที่กำหนด ซึ่งค่าที่ได้สามารถนำไปแสดงผลหรือใช้งานต่อ เช่นการทำระบบทาบบัตร RFID เพื่อการยืนยันตัวตนว่าบัตรที่ทาบนั้นมีอยู่ในระบบหรือไม่ หรือการทำระบบเช็คยอดเงินคงเหลือในบัตร เมื่อผู้ใช้งานนำบัตรเงินสดมาทาบกับเครื่องอ่านก็ให้ทำการตรวจสอบยอดเงินคงเหลือจากฐานข้อมูล เพื่อแจ้งแก่ผู้ใช้งานต่อไป

หมายเหตุ: ในบทความนี้จะเป็นการติดต่อกันระหว่าง NodeMCU ESP8285 กับ Mysql Server โดยตรง โดยไม่ใช่การส่งข้อมูลหรือเรียกข้อมูลด้วยไฟล์ PHP แต่อย่างใด

ก่อนการเริ่ม เรามาตรวจสอบสิ่งที่ต้องมีกันก่อน

  • บอร์ด ESP8285
  • Library MySQL_Connector_Arduino
  • ฐานข้อมูล MySQL สามารถจำลองสร้างแบบ local host หรือหากใช้งานจริงๆ ก็สั่งซื้อ Cloud Hosting จาก www.plathong.net ได้นะครับ (เนียนขายของ)
ติดตั้ง MySQL_Connector_Arduino

เมื่อทุกอย่างพร้อมก็มาเริ่มดูโค้ดไปทีละส่วนกันเลยครับ เริ่มจากส่วนแรกคือการตั้งค่า WiFi และ ข้อมูลการเชื่อมต่อ MySQL Server

โค้ดส่วนถัดไปจะเป็น void setup ซึ่งจะเป็นการเชื่อมต่อ WIFI และการ Connect ไปยัง MySQL Server นั่นเอง

สำหรับโค้ดในส่วนของ Loop นั้นจะเป็นการ Query ตามเงื่อนไข “SELECT * FROM DBName.TableName WHERE id = ‘5’ ” ซึ่งค่าที่ได้คือชื่อเมืองที่มี id=5 นั่นเอง (สำหรับบทความนี้เป็นขั้นตอนการ Query แบบพื้นฐานที่สุด) ในตัวอย่างจะให้ทำการ Query วนลูปไปทุกๆ 10 วินาที

สามารถคัดลอกโค้ดทั้งหมดได้ที่นี่ครับ หรือ https://github.com/sujanepanjan/Arduino-Query-MySQL

#include <ESP8266WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

const char* ssid     = "WIFI-SSID";
const char* password = "WIFI-PASSWORD";

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server_addr(192,168,1,100);  // IP ของ MySQL server
char dbuser[] = "DB-USERNAME";         // MySQL username
char dbpassword[] = "DB-PASSWORD";       // MySQL password

// SELECT query (เงื่อนไขในการ Query ข้อมูล)
char query[] = "SELECT * FROM DBName.TableName WHERE id = '5' ";  //กำหนดชื่อฐานข้อมูลและชื่อตาราง  DBName.TableName

WiFiClient client;    
MySQL_Connection conn((Client *)&client);

void setup() {
  Serial.begin(115200);
  delay(10);

  // Connect to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

  Serial.println("");
  Serial.print("WiFi connected to ");
  Serial.print("IP : ");
  Serial.println(WiFi.localIP());
  Serial.println("Your device is now online to internet.");
  Serial.println("");

 //MySQL Connection
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, dbuser, dbpassword)) {
    delay(1000);
    Serial.println("MySQL Connected.");
  }
  else
    Serial.println("Connection failed.");
  //conn.close();
  
}

void loop() {
  row_values *row = NULL;
  //String head_count ; 
  delay(10000);
  
  Serial.println("Selecting data.");

  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  
  cur_mem->execute(query); // Execute the query
  column_names *columns = cur_mem->get_columns(); // Fetch the columns

  // Read the row (we are only expecting the one)
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      Serial.println(row->values[1]); //ค่าที่ SELECT ได้จากฐานข้อมูล
    }
  } while (row != NULL);
  delete cur_mem;  // Deleting the cursor also frees up memory used 
}

ในส่วนของฐานข้อมูล เราสามารถสร้างตารางข้อมูลง่าย ๆ ขึ้นมาดังตัวอย่างเช่น

เมื่อทุกอย่างพร้อมให้ทำการ Upload โค้ดไปยังบอร์ด และเปิด Serial Monitor เพื่อดูค่าที่ได้ จากภาพคือระบบแสดงค่าชื่อเมือง ซึ่งก็คือ Hong Kong (id=5) นั่นเอง

Posted on

ESP8285 ส่งข้อความเข้า LINE Notify ผ่าน BLYNK Dashboard

สวัสดีครับ เพื่อนๆ สาวก IOT ทุกท่าน สำหรับบทความนี้จะเป็นการแนะนำการส่งข้อความเข้า LINE Notify โดยใช้บอร์ด ESP8285 ซึ่งมี WIFI ในตัว โดยอาศัย BLYNK Server เป็นสื่อกลางในการควบคุมสั่งการ โดยเราจะทำการสร้าง Switch บน Blynk Application บนมือถือ และสั่งการผ่านการกด คล้ายๆ กับเรากดสวิทต์เพื่อให้ ESP8285 ทำการส่งข้อความเข้า LINE Notify นั่นเอง

Continue reading ESP8285 ส่งข้อความเข้า LINE Notify ผ่าน BLYNK Dashboard
Posted on

สร้าง Dashboard ด้วย freeboard.io ดึงค่า จาก DHT22 ผ่าน Blynk HTTP RESTful API

สร้าง Dashboard ด้วย freeboard.io ให้ดึงค่า temperature & humidity จาก DHT22 ผ่าน Blynk HTTP RESTful API

Continue reading สร้าง Dashboard ด้วย freeboard.io ดึงค่า จาก DHT22 ผ่าน Blynk HTTP RESTful API