IoT & Full-Stack Web

Home-IoT-System

xenodeve · ส่วนตัว

ระบบควบคุม IoT เต็มรูปแบบ — Pico W (CircuitPython), Express.js, React และ MQTT ควบคุมจากระยะไกล

Home-IoT-System
ภาพรวมอ่านจบใน 30 วินาที

สรุปโปรเจกต์

ภาพรวม

โปรเจกต์ระบบควบคุม IoT แบบครบวงจรที่เชื่อมต่ออุปกรณ์ Pico W กับแดชบอร์ดเว็บผ่าน Express.js และ React โดยใช้ MQTT สำหรับการสื่อสารแบบเรียลไทม์และควบคุมรีเลย์จากระยะไกล

สรุป 30 วินาที

• สถาปัตยกรรมรองรับการติดตั้งทั้งในเครือข่ายท้องถิ่นและระบบคลาวด์ • แดชบอร์ด React แสดงสถานะแบบเรียลไทม์พร้อมระบบตั้งเวลาอัตโนมัติ • รองรับ Mock Mode สำหรับทดสอบ Backend โดยไม่ต้องใช้อุปกรณ์จริง

เหมาะกับใคร

เหมาะสำหรับทีมพัฒนา IoT และองค์กรที่ต้องการโซลูชันควบคุมอุปกรณ์อัจฉริยะแบบ End-to-End ที่ขยายผลได้จริง

หมวดหมู่
IoT & Full-Stack Web
ปี
2026
ผู้ดูแลผลงาน
xenodeve
รายละเอียดเพิ่มเติมรายละเอียดเชิงลึก

โปรเจกต์นี้เป็นระบบควบคุมและติดตามสถานะอุปกรณ์ IoT แบบครบวงจร ประกอบด้วยฮาร์ดแวร์ Pico W ที่ทำงานด้วย CircuitPython เพื่อควบคุมรีเลย์และซิงค์เวลาผ่าน NTP พร้อมเปิด REST API และส่งข้อมูลผ่านโปรโตคอล MQTT ส่วน Backend พัฒนาด้วย Express.js ทำหน้าที่เป็นเกตเวย์ API จัดการการสื่อสารผ่าน MQTT และรองรับการตั้งตารางเวลาอัตโนมัติ (Scheduler) พร้อมระบบ Mock Mode สำหรับการทดสอบในขั้นตอนการพัฒนา ส่วน Frontend สร้างด้วย React และ Vite ออกแบบมาเพื่อเป็นแดชบอร์ดควบคุมมืออาชีพ รองรับการอัปเดตสถานะแบบเรียลไทม์ผ่าน WebSocket พร้อมฟีเจอร์ตัวนับเวลาแบบแอนิเมชันและอินเทอร์เฟซสำหรับการตั้งเวลาทำงาน

เอกสารต้นฉบับรายละเอียด (README)

Home IoT System

ระบบควบคุม IoT แบบเต็มรูปแบบด้วย Pico W (CircuitPython), Express.js Backend, React Frontend และ MQTT สำหรับควบคุมจากระยะไกล

screencapture-localhost-3000-2025-11-20-15_15_16

📋 ภาพรวมโปรเจ็กต์

โปรเจ็กต์นี้ประกอบด้วย 3 ส่วนหลัก:

  1. Pico W (IoT Device): ควบคุมรีเลย์และเปิด REST API + MQTT พร้อม NTP time sync
  2. Express Backend: Gateway API, MQTT client, scheduler service และ mock mode สำหรับทดสอบ
  3. React Frontend: Professional dashboard UI พร้อม real-time updates, animated counter clock, และ scheduling interface

🏛️ System Architecture

Same-LAN Deployment (Development/Local Network)

┌─────────────────────────────────────────────────────────────────┐
│                         Local Network (192.168.x.x)              │
│                                                                  │
│  ┌──────────────┐      HTTP API       ┌──────────────┐          │
│  │              │◄────────────────────►│              │          │
│  │   Pico W     │                      │   Backend    │          │
│  │ (code.py)    │                      │ (Express.js) │          │
│  │              │◄─────────────────────┤              │          │
│  │  GPIO14      │    MQTT (Optional)   │  Port 3001   │          │
│  │  Relay       │                      │              │          │
│  └──────────────┘                      └───────┬──────┘          │
│         ▲                                      │                 │
│         │                                      │ REST API        │
│         │                                      ▼                 │
│         │                              ┌──────────────┐          │
│         │                              │   Frontend   │          │
│         │                              │  (React +    │          │
│         └──────────Real-time───────────┤   Vite)      │          │
│                   Status Update        │  Port 3000   │          │
│                                        └──────────────┘          │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘
                           │
                           │ MQTT WebSocket (Optional)
                           ▼
                  ┌─────────────────┐
                  │  Public MQTT     │
                  │    Broker        │
                  │ broker.hivemq.com│
                  └─────────────────┘

Cross-LAN Deployment (Production/Remote Access)

┌────────────────────────┐                    ┌────────────────────────┐
│   Home Network         │                    │   Cloud/VPS/Internet   │
│   (192.168.1.x)        │                    │                        │
│                        │                    │                        │
│  ┌──────────────┐      │                    │  ┌──────────────┐      │
│  │   Pico W     │      │   MQTT Pub/Sub     │  │   Backend    │      │
│  │  (code.py)   │◄─────┼────────────────────┼─►│ (Express.js) │      │
│  │              │      │                    │  │              │      │
│  │  GPIO14      │      │                    │  │  MongoDB     │      │
│  │  Relay       │      │                    │  │  Atlas       │      │
│  └──────────────┘      │                    │  └───────┬──────┘      │
│         ▲              │                    │          │             │
│         │              │                    │          │ HTTPS API   │
│         │              │                    │          ▼             │
│         │              │                    │  ┌──────────────┐      │
│         │              │                    │  │   Frontend   │      │
│         │              │   MQTT WebSocket   │  │  (React +    │      │
│         └──────────────┼────────────────────┼──┤   Vite)      │      │
│            Real-time   │                    │  │              │      │
│            Status      │                    │  └──────────────┘      │
│                        │                    │                        │
└────────────────────────┘                    └────────────────────────┘
                 │                                      │
                 │           ┌─────────────────┐        │
                 └───────────►  Public MQTT     ◄───────┘
                             │    Broker        │
                             │ broker.hivemq.com│
                             │  Port: 1883 (TCP)│
                             │  Port: 8884 (WSS)│
                             └─────────────────┘

Communication Flow

1. Control Command:
   User → Frontend (React) → Backend (Express) → MQTT Broker
                                                       ↓
                                              Pico W → Relay ON/OFF

2. Status Update (Real-time):
   Relay → Pico W → MQTT Broker → Frontend (WebSocket) → UI Update
                          ↓
                    Backend (Subscribe) → Database (Schedule Sync)

3. Scheduled Task:
   Scheduler (Backend) → Check TimeExecute → MQTT Broker → Pico W → Relay

Technology Stack per Component

┌─────────────────────────────────────────────────────────────────────┐
│ Pico W Simulator (Python)                                           │
│ • Python 3.x                                                        │
│ • Flask (HTTP Server)                                               │
│ • paho-mqtt (MQTT Client - TCP port 1883)                           │
│ • ntplib (NTP Client - time.navy.mi.th)                             │
│ • threading (Concurrent HTTP + MQTT)                                │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│ Pico W (IoT Device)                                                 │
│ • CircuitPython 9.x                                                 │
│ • adafruit_httpserver (REST API)                                    │
│ • adafruit_minimqtt (MQTT Client - TCP port 1883)                  │
│ • NTP Client (time.navy.mi.th)                                      │
│ • GPIO Control (digitalio)                                          │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│ Backend (Express.js)                                                │
│ • Node.js + Express 4                                               │
│ • MQTT.js (TCP Client - port 1883)                                  │
│ • Mongoose (MongoDB Atlas)                                          │
│ • Luxon (Timezone handling)                                         │
│ • Axios (HTTP Client)                                               │
│ • node-cron (Scheduler - every 10s)                                 │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│ Frontend (React)                                                    │
│ • React 18 + Vite 6                                                 │
│ • MQTT.js (WebSocket Client - port 8884)                            │
│ • GSAP 3.13 (Animations)                                            │
│ • Axios (REST API)                                                  │
│ • Custom Components (MagicBento, AnimatedSelect, Dropdowns)         │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│ Infrastructure                                                      │
│ • MQTT Broker: HiveMQ Public (broker.hivemq.com)                    │
│ • Database: MongoDB Atlas (Cloud)                                   │
│ • Time Service: worldtimeapi.org / Thai Navy NTP                    │
└─────────────────────────────────────────────────────────────────────┘

🏗️ โครงสร้างโปรเจ็กต์

Home-IoT-System/
├── code.py                    # CircuitPython สำหรับ Pico W (HTTP + MQTT + NTP sync)
├── pico_simulator.py         # Python simulator สำหรับทดสอบ Pico W โดยไม่ต้องมีฮาร์ดแวร์จริง
├── requirements_simulator.txt # Dependencies สำหรับ Pico W simulator
├── settings.toml              # WiFi + MQTT config สำหรับ Pico W
├── test_ntp.py                # ทดสอบ NTP time sync
├── MQTT_SETUP.md              # คู่มือการตั้งค่า MQTT
├── backend/                   # Express.js backend
│   ├── server.js              # Express server + MQTT + Scheduler
│   ├── models/                # Mongoose models (Schedule)
│   │   └── Schedule.js        # โมเดลกำหนดการสำหรับ MongoDB
│   ├── services/              # Time service (multi-provider NTP) + scheduler loop
│   │   ├── fileStorage.js     # ที่เก็บข้อมูล JSON สำรองสำหรับการพัฒนา
│   │   ├── mongoStorage.js    # บูรณาการ MongoDB สำหรับการใช้งานจริง
│   │   ├── scheduler.js       # ลูปการทำงานอัตโนมัติของตัวกำหนดเวลา
│   │   └── timeService.js     # การซิงค์เวลา NTP/HTTP หลายผู้ให้บริการ (Thai Navy เป็นหลัก)
│   ├── data/                  # ที่เก็บไฟล์ JSON (fallback)
│   │   └── schedules.json     # ที่เก็บกำหนดการในเครื่อง
│   ├── package.json
│   ├── .env.example           # ตัวอย่างการตั้งค่า environment variables
│   └── README.md
├── frontend/                  # React frontend
│   ├── index.html             # จุดเริ่มต้น HTML
│   ├── src/
│   │   ├── App.jsx            # Professional dashboard + scheduler UI
│   │   ├── App.css            # Modern dark theme styling
│   │   ├── main.jsx           # จุดเริ่มต้น
│   │   ├── index.css          # สไตล์ส่วนกลาง
│   │   └── components/
│   │       ├── Counter.jsx    # นาฬิกานับแบบหมุนเคลื่อนไหว (GSAP)
│   │       ├── MagicBento.jsx # ระบบการ์ดแบบโต้ตอบพร้อมเอฟเฟกต์
│   │       ├── MagicBento.css # สไตล์สำหรับเอฟเฟกต์อนุภาคและขอบเรืองแสง
│   │       ├── AnimatedSelect.jsx    # ดรอปดาวน์เลือกแบบกำหนดเองพร้อมแอนิเมชันหมุน X
│   │       ├── AnimatedSelect.css    # สไตล์ดรอปดาวน์เลือก
│   │       ├── DateDropdown.jsx      # เครื่องมือเลือกวันที่แบบกำหนดเองพร้อมปฏิทิน
│   │       ├── DateDropdown.css      # สไตล์เครื่องมือเลือกวันที่
│   │       ├── TimeDropdown.jsx      # เครื่องมือเลือกเวลาแบบกำหนดเอง (รูปแบบ 24 ชั่วโมง)
│   │       └── TimeDropdown.css      # สไตล์เครื่องมือเลือกเวลา
│   ├── config/
│   │   ├── config.js          # การตั้งค่าที่รวมศูนย์ (ช่วงเวลา, โซนเวลา, API)
│   │   └── mqttConfig.js      # การตั้งค่า MQTT WebSocket
│   ├── package.json
│   ├── vite.config.js
│   ├── .env.example           # ตัวอย่างการตั้งค่า environment variables (Cross-LAN)
│   └── README.md
└── lib/                       # Adafruit libraries สำหรับ Pico W
    └── adafruit_httpserver/   # HTTP server library
        ├── __init__.mpy
        ├── authentication.mpy
        ├── exceptions.mpy
        ├── headers.mpy
        ├── methods.mpy
        ├── mime_type.mpy
        ├── mime_types.mpy
        ├── README.md
        ├── request.mpy
        ├── response.mpy
        ├── route.mpy
        ├── server.mpy
        └── status.mpy

🚀 Quick Start

การทดสอบโดยไม่มี Pico W (Mock Mode + MQTT)

1. เริ่ม Backend (Mock Mode + MQTT)

cd backend
npm install
copy .env.example .env

แก้ไข .env:

MOCK_MODE=true
MQTT_ENABLED=true
MQTT_BROKER=mqtt://broker.hivemq.com

รัน backend:

npm start

ℹ️ Scheduling Dashboard จำเป็นต้องตั้งค่า MONGODB_URI (เช่น MongoDB Atlas) และเปิดให้ backend เข้าถึง พร้อมกำหนด TIMEZONE/TIME_API_URL หากต้องการใช้ผู้ให้บริการเวลาภายนอกอื่น ๆ

คุณจะเห็น:

🌐 MQTT ENABLED - Connecting to broker
📡 MQTT Connected to broker

2. เริ่ม Pico W Simulator (แทน Pico W จริง)

pip install -r requirements_simulator.txt

ตั้งค่า environment variables (เหมือน settings.toml):

# Windows
set MQTT_ENABLED=true
set MQTT_BROKER=broker.hivemq.com
set MQTT_PORT=1883

# Linux/Mac
export MQTT_ENABLED=true
export MQTT_BROKER=broker.hivemq.com
export MQTT_PORT=1883

รัน simulator:

python pico_simulator.py

คุณจะเห็น:

🚀 Starting Pico W Simulator...
🕒 Attempting to sync time with NTP server: time.navy.mi.th
✅ Time synced successfully!
📡 MQTT Connected to broker: broker.hivemq.com
📨 Subscribed to: home-iot/relay/control
🌐 Starting HTTP server on http://localhost:5000
✅ Pico W Simulator is running!
📡 HTTP API: http://localhost:5000/api/relay
🌐 Web Interface: http://localhost:5000

3. เริ่ม Frontend

cd frontend
npm install
npm run dev

เปิดบราวเซอร์ที่ http://localhost:3000

คุณจะเห็น badge:

  • Real-time ON (สีเขียว) - MQTT WebSocket เชื่อมต่อแล้ว
  • 🌐 Backend MQTT (สีเขียว) - Backend เชื่อมต่อ MQTT broker

4. ทดสอบการทำงาน

ทดสอบผ่าน Web Interface:

  • เปิด http://localhost:5000 ในบราวเซอร์
  • กดปุ่ม ON/OFF เพื่อควบคุม relay จำลอง

ทดสอบผ่าน API:

# ดูสถานะ
curl http://localhost:5000/api/relay

# เปิด relay
curl -X POST http://localhost:5000/api/relay -H "Content-Type: application/json" -d '{"state": "on"}'

# ปิด relay
curl -X POST http://localhost:5000/api/relay -H "Content-Type: application/json" -d '{"state": "off"}'

ทดสอบ Real-time Sync: เปิดหลายแท็บ Frontend แล้วลองควบคุม relay - ทุกแท็บจะอัพเดทพร้อมกันทันที!

การใช้งานจริงกับ Pico W

1. Setup Pico W

  1. ติดตั้ง CircuitPython บน Pico W

  2. (Optional) ติดตั้ง adafruit_minimqtt library ใน lib/ หากต้องการใช้ MQTT

  3. คัดลอก code.py ไปยัง Pico W

  4. คัดลอกโฟลเดอร์ lib/ ทั้งหมดไปยัง Pico W

  5. สร้างไฟล์ settings.toml บน Pico W:

    แบบ HTTP-only (ไม่ใช้ MQTT):

    CIRCUITPY_WIFI_SSID = "ชื่อ WiFi"
    CIRCUITPY_WIFI_PASSWORD = "รหัสผ่าน"
    # MQTT_ENABLED = "false" (หรือไม่ต้องใส่)
    

    แบบ HTTP + MQTT (รองรับ remote access):

    CIRCUITPY_WIFI_SSID = "ชื่อ WiFi"
    CIRCUITPY_WIFI_PASSWORD = "รหัสผ่าน"
    
    # MQTT Settings (ต้องตรงกับ backend/.env)
    MQTT_ENABLED = "true"
    MQTT_BROKER = "broker.hivemq.com"
    MQTT_PORT = "1883"
    MQTT_USERNAME = ""
    MQTT_PASSWORD = ""
    
  6. เชื่อมต่อรีเลย์กับ GPIO14 (GP14)

  7. จดไว้ว่า IP address ของ Pico W คือเท่าไร

หมายเหตุ: code.py จะ auto-detect ว่ามี MQTT library หรือไม่

  • ถ้ามี + MQTT_ENABLED="true" → ทำงานแบบ HTTP + MQTT
  • ถ้าไม่มี library หรือ connection ล้มเหลว → auto-fallback เป็น HTTP-only

2. Setup Backend

cd backend
npm install
copy .env.example .env

แก้ไข .env:

PORT=3001
PICO_IP=192.168.1.XXX  # IP ของ Pico W
MOCK_MODE=false
MQTT_ENABLED=true
MQTT_BROKER=mqtt://broker.hivemq.com
MONGODB_URI=mongodb+srv://<user>:<pass>@cluster.mongodb.net/home-iot
TIMEZONE=Asia/Bangkok
TIME_API_URL=https://worldtimeapi.org/api

รัน backend:

npm start

3. Setup Frontend

cd frontend
npm install
npm run dev

เปิดบราวเซอร์ที่ http://localhost:3000

📡 API Endpoints & MQTT Topics

Backend API (Express)

GET  /health                  - Health check (รวมสถานะ MQTT)
GET  /api/relay/status        - ดูสถานะรีเลย์
POST /api/relay/control       - ควบคุมรีเลย์ {"state": "on"|"off"}
POST /api/relay/toggle        - สลับสถานะรีเลย์
GET  /api/time/now            - เวลาปัจจุบันจาก third-party time server
GET  /api/schedules           - ดึงรายการกำหนดการทั้งหมด
POST /api/schedules           - สร้างกำหนดการใหม่ { action, executeAt, timezone }
PATCH /api/schedules/:id/cancel - ยกเลิกกำหนดการที่รอดำเนินการ
DELETE /api/schedules/:id     - ลบกำหนดการออกจากระบบ

Pico W API (CircuitPython)

GET  /api/relay               - ดูสถานะรีเลย์ (JSON)
POST /api/relay               - ควบคุมรีเลย์ (JSON)
GET  /                        - หน้าเว็บควบคุมแบบเดิม

⏱️ Scheduling Flow

  1. Frontend dashboard ส่งคำขอสร้างกำหนดการไปยัง /api/schedules
  2. Backend บันทึกข้อมูลลง MongoDB Atlas ผ่าน Mongoose (Schedule model)
  3. Scheduler service ดึงเวลาปัจจุบันจาก worldtimeapi.org (หรือ service อื่นตาม TIME_API_URL)
  4. เมื่อถึงเวลาที่กำหนด ระบบจะส่งคำสั่งควบคุมรีเลย์อัตโนมัติ พร้อม publish สถานะผ่าน MQTT ให้ทุก client รับรู้

MQTT Topics

home-iot/relay/control        - Publish: ส่งคำสั่ง {"state": "on"|"off"}
home-iot/relay/status         - Subscribe: รับสถานะรีเลย์
home-iot/system/status        - Subscribe: รับสถานะ backend
home-iot/device/status        - Subscribe: รับสถานะ Pico W

MQTT Configuration

⚠️ สำคัญ: ต้องตั้งค่า MQTT ให้ตรงกัน 3 ที่:

  1. settings.toml (Pico W) - TCP port 1883
  2. backend/.env (Backend) - TCP port 1883
  3. frontend/src/mqttConfig.js (Frontend) - WebSocket port 8884

MQTT Brokers:

สำหรับทดสอบ (Public - ไม่ต้อง authentication):

  • Pico W: broker.hivemq.com:1883 (MQTT TCP)
  • Backend: mqtt://broker.hivemq.com:1883
  • Frontend: wss://broker.hivemq.com:8884/mqtt (WebSocket SSL)

สำหรับ Production:

  • ติดตั้ง Mosquitto บนเครื่องตัวเอง
  • ตั้งค่า authentication และ SSL
  • ดูรายละเอียดใน MQTT_SETUP.md

🎨 Features

Frontend (React + Vite)

  • Modern Professional Dashboard - Dark theme พร้อม gradient effects
  • Magic Bento Grid System - เอฟเฟกต์การ์ดแบบโต้ตอบพร้อมอนุภาค, สปอตไลท์, ขอบเรืองแสง, แม่เหล็ก และคลิก ripples
  • Animated Rolling Counter Clock - แสดงเวลาแบบ real-time ด้วย GSAP
  • Animated Light Bulb Indicator - หลอดไฟ 3D ขนาดใหญ่ที่เรืองแสงเมื่อรีเลย์เปิด (ขยาย 40%)
  • Custom Toggle Switch - ปุ่มสไลด์แบบ iOS-style สำหรับควบคุมรีเลย์
  • Real-time MQTT Sync - อัปเดตสถานะทันทีผ่าน WebSocket
  • Smart Scheduling UI - สร้างและจัดการกำหนดการเปิด-ปิดอัตโนมัติพร้อม form ที่สวยงาม
  • Status Indicators - แสดงสถานะการเชื่อมต่อ MQTT, Backend, Pico W แบบ real-time
  • Multi-device Sync - ควบคุมจากหลายอุปกรณ์พร้อมกัน
  • Thai Localization - ภาษาไทยทั้งระบบ พร้อม IBM Plex Sans Thai font
  • Smooth Transitions - Animation และ transition ทุกองค์ประกอบด้วย GSAP hardware acceleration
  • Optimistic UI Updates - อัปเดต UI ทันทีพร้อม rollback เมื่อเกิด error
  • Centralized Config - จัดการ intervals และ settings ที่ config.js
  • Mobile Optimized - ปิด animations อัตโนมัติบนหน้าจอเล็กกว่า 768px
  • Responsive Design - รองรับทุกขนาดหน้าจอ

Backend (Express.js + Node.js)

  • Multi-provider Time Service - ดึงเวลาจาก Thai Navy NTP (primary) + HTTP fallbacks
  • No Cache Time API - เวลาแม่นยำ real-time ไม่มี cache
  • Smart Scheduler - ตรวจสอบและรันกำหนดการอัตโนมัติ
  • Dual Storage Support - MongoDB (production) + JSON file (development)
  • MQTT-first Relay Control - ส่งคำสั่งผ่าน MQTT ก่อน fallback เป็น HTTP
  • Connection Status Tracking - ตรวจสอบและรายงานสถานะ Pico W
  • Provider Failure Tracking - จำผู้ให้บริการที่ล้มเหลวและ skip ชั่วคราว
  • Health Check API - แสดงสถานะระบบทั้งหมด
  • CORS & Auto-reconnect - รองรับ cross-origin และเชื่อมต่อ MQTT อัตโนมัติ
  • Mock Mode - ทดสอบโดยไม่ต้องมี Pico W จริง

Pico W (CircuitPython)

  • NTP Time Sync - ดึงเวลาจาก Thai Navy NTP server พร้อม UTC+7 offset
  • RTC Integration - ใช้ Real-time Clock chip บน Pico W
  • WiFi Connectivity - เชื่อมต่อ WiFi อัตโนมัติ
  • HTTP Server - REST API สำหรับควบคุมรีเลย์
  • MQTT Client - รับ-ส่งคำสั่งผ่าน MQTT (optional)
  • Auto-detect & Fallback - ตรวจสอบ MQTT library และ gracefully fallback เป็น HTTP-only
  • Relay Control - ควบคุมรีเลย์ผ่าน GPIO14
  • Error Recovery - Auto-restart เมื่อเกิด error ร้ายแรง

🔧 การ Deploy

Option 1: Development (localhost)

  • Backend: http://localhost:3001
  • Frontend: http://localhost:3000
  • MQTT: WebSocket to public broker

Option 2: Production (เครื่องเดียว)

Build frontend แล้วให้ Express serve:

cd frontend
npm run build

ปรับ backend ให้ serve static files จาก frontend/dist/

Option 3: Deploy แยกเครื่อง

  • Deploy frontend บน Vercel/Netlify
  • รัน backend บนเครื่องที่เข้าถึง Pico W ได้
  • ตั้งค่า MQTT broker (Mosquitto/HiveMQ Cloud)
  • Frontend เชื่อมต่อ MQTT ผ่าน WebSocket

Option 4: Cross-LAN Deployment (Pico W อยู่บ้าน, Backend+Frontend อยู่ Cloud)

ระบบรองรับ Cross-LAN แล้ว! คุณสามารถควบคุม Pico W ที่บ้านจาก Backend+Frontend ที่อยู่บน Cloud/VPS ได้

การตั้งค่า:

1. Pico W (บ้าน):

# settings.toml
MQTT_ENABLED = "true"
MQTT_BROKER = "broker.hivemq.com"
MQTT_PORT = "1883"

2. Backend (Cloud/VPS):

# .env
MQTT_ENABLED=true
MQTT_BROKER=mqtt://broker.hivemq.com
MQTT_PORT=1883
MONGODB_URI=mongodb+srv://your-atlas-cluster

3. Frontend (Cloud/VPS):

# .env
VITE_API_BASE=https://your-backend-domain.com/api

การสื่อสาร:

Pico W (บ้าน) ←→ MQTT Broker (Internet) ←→ Backend (Cloud)
                                             ↑
                                        Frontend (Cloud)

ข้อควรระวัง (Security):

  • ปัจจุบันใช้ Public MQTT Broker (broker.hivemq.com) ที่ไม่มี authentication
  • สำหรับ Production แนะนำใช้:
    • HiveMQ Cloud (มี free tier) + username/password
    • หรือติดตั้ง Mosquitto บน VPS ของคุณเอง พร้อม SSL/TLS

ดูรายละเอียดเพิ่มเติม:

  • MQTT_SETUP.md - คู่มือการตั้งค่า MQTT broker และทดสอบ

🛠️ Tech Stack

Frontend

  • React 18 + Vite 6 - การพัฒนาที่รวดเร็วด้วย HMR และการ build ที่ปรับให้เหมาะสม
  • GSAP 3.13 - ไลบรารีแอนิเมชันระดับมืออาชีพสำหรับเอฟเฟกต์ Counter และ Magic Bento พร้อม hardware acceleration
  • MQTT.js - การเชื่อมต่อ WebSocket สำหรับการอัปเดตแบบ real-time
  • Axios - HTTP client สำหรับคำขอ API
  • CSS3 - ธีมมืดแบบกำหนดเองพร้อม gradients, shadows, animations และเอฟเฟกต์แบบโต้ตอบ
  • IBM Plex Sans Thai - ฟอนต์ไทยระดับมืออาชีพสำหรับ UI ทั้งหมด
  • Magic Bento Components - ระบบการ์ดแบบโต้ตอบที่นำกลับมาใช้ใหม่ได้ พร้อมอนุภาค, สปอตไลท์, ขอบเรืองแสง, แม่เหล็ก และคลิก ripples

Backend

  • Express.js 4 + Node.js - RESTful API server
  • Axios - HTTP client สำหรับ time APIs และการสื่อสารกับ Pico W
  • MQTT.js - TCP broker client สำหรับ pub/sub messaging
  • Mongoose - บูรณาการ MongoDB Atlas สำหรับกำหนดการ
  • Luxon - การแปลงโซนเวลาและการจัดการวันที่
  • node-cron - ลูปตัวกำหนดเวลา (ทุก 10 วินาที)
  • dgram (Node.js UDP) - โปรโตคอล NTP สำหรับ Thai Navy time server

Pico W (CircuitPython)

  • CircuitPython 9.x - Python สมัยใหม่สำหรับไมโครคอนโทรลเลอร์
  • adafruit_httpserver - HTTP server น้ำหนักเบา
  • adafruit_ntp - Network Time Protocol client
  • socketpool + wifi - การเชื่อมต่อเครือข่าย
  • rtc - บูรณาการ Real-time Clock chip
  • adafruit_minimqtt (optional) - MQTT client พร้อม auto-fallback
  • digitalio - การควบคุม GPIO สำหรับรีเลย์ (GP14)

Infrastructure

  • MongoDB Atlas - ฐานข้อมูลคลาวด์สำหรับการจัดเก็บกำหนดการ
  • HiveMQ (Public) / Mosquitto (Self-hosted) - MQTT brokers
  • Hardware: โมดูลรีเลย์ (GPIO14)
  • Protocol: HTTP REST API + MQTT (TCP/WebSocket)
  • Time Source: worldtimeapi.org (ปรับแต่งได้ผ่าน TIME_API_URL)

📚 Documentation

ดูรายละเอียดเพิ่มเติมใน:

  • code.py - CircuitPython สำหรับ Pico W (HTTP + MQTT + NTP sync)
  • pico_simulator.py - Python simulator สำหรับทดสอบ Pico W โดยไม่ต้องมีฮาร์ดแวร์จริง
  • requirements_simulator.txt - Dependencies สำหรับ Pico W simulator
  • settings.toml - WiFi + MQTT config สำหรับ Pico W
  • Backend README - Express server + การตั้งค่า MQTT
  • backend/models/Schedule.js - โครงสร้างกำหนดการบน MongoDB
  • backend/services/timeService.js - การซิงค์เวลา NTP/HTTP หลายผู้ให้บริการ (Thai Navy เป็นหลัก)
  • backend/services/scheduler.js - ลูปการทำงานอัตโนมัติของตัวกำหนดเวลา
  • backend/services/fileStorage.js - ที่เก็บข้อมูล JSON สำรองสำหรับการพัฒนา
  • backend/services/mongoStorage.js - บูรณาการ MongoDB สำหรับการใช้งานจริง
  • Frontend README - React app + WebSocket MQTT
  • frontend/src/config.js - การตั้งค่าที่รวมศูนย์ (ช่วงเวลา, โซนเวลา, API base)
  • frontend/src/components/Counter.jsx - นาฬิกานับแบบหมุนเคลื่อนไหวด้วย GSAP
  • frontend/src/components/MagicBento.jsx - ระบบการ์ด Magic Bento พร้อมเอฟเฟกต์แบบโต้ตอบ
  • frontend/src/components/MagicBento.css - สไตล์สำหรับเอฟเฟกต์อนุภาคและขอบเรืองแสง
  • frontend/src/App.jsx - ตรรกะแดชบอร์ดหลัก (ควบคุมรีเลย์, การกำหนดเวลา, อัปเดตแบบ real-time)
  • frontend/src/App.css - สไตล์ธีมมืดสมัยใหม่ (แอนิเมชันหลอดไฟใหญ่ขึ้น 40%, ปุ่มสลับ, ขอบสถานะ, สไตล์ฟอร์ม)
  • MQTT Setup Guide - คู่มือการตั้งค่า MQTT broker และทดสอบ
  • test_ntp.py - Python script สำหรับทดสอบ NTP time sync

🐛 Troubleshooting

Backend ไม่เชื่อมต่อ Pico W

  • ตรวจสอบ IP address ใน .env
  • Ping Pico W: ping <PICO_IP>
  • ตรวจสอบว่า Pico W รัน code ใหม่ที่มี API endpoints

Frontend ไม่เชื่อมต่อ Backend

  • ตรวจสอบว่า backend รันที่ port 3001
  • ตรวจสอบ proxy config ใน vite.config.js
  • ดู console log ใน browser

MQTT ไม่เชื่อมต่อ

Pico W:

  • ตรวจสอบว่าติดตั้ง adafruit_minimqtt library แล้ว
  • ตรวจสอบ MQTT_ENABLED="true" ใน settings.toml
  • ดู serial console - ต้องเห็น "✓ MQTT enabled"
  • ถ้าเห็น "⚠ MQTT setup failed" → จะ auto-fallback เป็น HTTP-only

Backend:

  • ตรวจสอบ MQTT_ENABLED=true ใน backend .env
  • ตรวจสอบ URL: mqtt://broker.hivemq.com (มี mqtt:// prefix)
  • ดู console log - ต้องเห็น "📡 MQTT Connected"

Frontend:

  • ตรวจสอบ URL: wss://broker.hivemq.com:8884/mqtt (WebSocket SSL)
  • ดู browser console - ต้องเห็น "✅ Frontend MQTT Connected"
  • Badge ต้องแสดง "✨ Real-time ON" สีเขียว

ทั่วไป:

  • Ping broker: ping broker.hivemq.com
  • ลองใช้ MQTT Explorer เพื่อทดสอบ broker
  • ตรวจสอบว่า broker, port, topics ตรงกันทั้ง 3 ที่

Frontend ไม่แสดง Real-time

  • ดู browser console - ต้องเห็น "✅ Frontend MQTT Connected"
  • ตรวจสอบว่า broker รองรับ WebSocket (port 8884)
  • Badge ต้องแสดง "✨ Real-time ON" สีเขียว

Mock Mode ไม่ทำงาน

  • ตรวจสอบ MOCK_MODE=true ใน backend/.env
  • Restart backend

Scheduling ไม่ทำงาน / ปุ่มตั้งเวลาเป็นสีเทา

  • ตรวจสอบว่า backend มีค่า MONGODB_URI และเชื่อมต่อ Atlas สำเร็จ (health.database.connected ต้องเป็น true)
  • เปิด IP allowlist ของ MongoDB Atlas ให้ครอบคลุมเครื่อง backend
  • ตรวจสอบ log ว่ามีข้อความ Scheduler started
  • ตรวจสอบว่า TIME_API_URL เข้าถึงได้ (backend จะ fallback เป็น system clock หากล้มเหลว)

Counter Animation ไม่ทำงาน

  • ตรวจสอบว่าติดตั้ง GSAP: cd frontend && npm list gsap
  • ลอง reinstall: npm install gsap@latest
  • ตรวจสอบ browser console หา errors จาก Counter component
  • GSAP จะใช้ hardware acceleration โดยอัตโนมัติ

Magic Bento Effects ไม่ทำงาน

  • ตรวจสอบว่าติดตั้ง GSAP: npm list gsap (ต้องเป็น 3.13.0 ขึ้นไป)
  • Effects จะถูกปิดอัตโนมัติบนหน้าจอเล็กกว่า 768px (mobile)
  • ตรวจสอบ browser console หา errors จาก MagicBento components
  • ลด particleCount prop หากเห็นว่าช้า (default: 8-12 particles)
  • ปรับ magnetismStrength (default: 0.05 สำหรับ card เล็ก, 0.015 สำหรับ card ใหญ่)
  • ปรับ clickEffectScale (default: 1 สำหรับ card เล็ก, 0.4 สำหรับ card ใหญ่)

เวลาไม่ตรง / Time Sync ล้มเหลว

  • การ fallback หลายผู้ให้บริการ: TimeService จะลองตามลำดับ:
    1. Thai Navy NTP (navy.ntppool.in.th:123 UDP)
    2. HTTP Time Header (https://www.google.com)
    3. WorldTimeAPI (https://worldtimeapi.org/api/timezone/Asia/Bangkok)
    4. System Clock (last resort)
  • ตรวจสอบ network connectivity: ping navy.ntppool.in.th
  • ดู backend logs - จะบอกว่าใช้ provider ไหนสำเร็จ
  • หากทุก provider ล้มเหลว จะใช้ system clock พร้อมแจ้งเตือน
  • ปรับ sync interval ได้ที่ frontend/src/config.js (TIME_SYNC_INTERVAL)

Configuration ไม่มีผล / Intervals ไม่ทำงาน

  • ตรวจสอบว่า import จาก ./config หรือ ../config/config.js ถูกต้อง
  • Restart Vite dev server: Ctrl+C แล้ว npm run dev
  • ตรวจสอบ APP_CONFIG values ใน browser console: console.log(APP_CONFIG)
  • การตั้งค่าที่มีอยู่:
    • TIME_SYNC_INTERVAL - ความถี่ sync เวลากับ backend (default: 30000ms / 30s)
    • SCHEDULE_FETCH_INTERVAL - ความถี่ดึงรายการกำหนดการ (default: 30000ms)
    • CLOCK_UPDATE_INTERVAL - ความถี่อัปเดตนาฬิกาหน้าจอ (default: 1000ms / 1s)

🎯 ขั้นตอนถัดไป

  • ✅ เพิ่ม MQTT สำหรับ remote access
  • ✅ Real-time sync ผ่าน WebSocket
  • เพิ่ม authentication (JWT/OAuth)
  • ติดตั้ง Mosquitto broker แบบ self-hosted
  • รองรับรีเลย์หลายช่อง
  • เพิ่มการตั้งเวลา (scheduling)
  • บันทึกประวัติการใช้งาน (database)
  • Dashboard แสดงกราฟสถิติ
  • Mobile app (React Native)
  • PWA support
  • Home Assistant integration
  • Voice control (Alexa/Google)

📄 License

MIT

👨‍💻 Author

Home IoT System Project

Project AI

ถาม AI เกี่ยวกับ Home-IoT-System

ถามแนวทาง เทคโนโลยี หรือความเหมาะสมของโปรเจกต์นี้กับไอเดียของคุณ

กำลังโหลดแชท / Loading chat…

ผู้มีส่วนร่วม
คุยกับ AI ดูงานคล้ายกันติดต่อจ้างงาน