MQTT_SCHEMA HUB - zero1ne-26/doc GitHub Wiki

Hub MQTT ์Šคํ‚ค๋งˆ

์ด ๋ฌธ์„œ๋Š” Hub ํŒ€์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋น„์–ด์žˆ๋Š” ํ•ญ๋ชฉ์„ ์ฑ„์›Œ์ฃผ์„ธ์š”.


๋ชฉ์ฐจ


๊ฐœ์š”

ํ•ญ๋ชฉ ๋‚ด์šฉ
์ œ๊ณต๊ฐ’ session_id (์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰)
์ž‘์„ฑ ์ฃผ์ฒด Hub ํŒ€ (์‹ ์Šนํ›ˆ ์ฑ…์ž„)
์ตœ์ข… ์ˆ˜์ •์ผ 2026-09-29

AI Neural TREE ๊ตฌํ˜„ ๋ช…์„ธ

1. ๊ฐœ์š”

AI Neural Tree๋Š” Physical AI Diorama ์‹œ์Šคํ…œ์˜ ์ค‘์•™ ํ—ˆ๋ธŒ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์žฅ์น˜์ด๋‹ค.

Raspberry Pi์—์„œ MQTT Broker์— ์—ฐ๊ฒฐํ•˜์—ฌ ์™ธ๋ถ€ Orchestration Server์˜ ์ œ์–ด ๋ช…๋ น์„ ์ˆ˜์‹ ํ•˜๊ณ , Arduino๋ฅผ ํ†ตํ•ด AI Neural Tree ์ „์› ๋ฐ ์ƒํƒœ LED๋ฅผ ์ œ์–ดํ•œ๋‹ค.

๋˜ํ•œ AI Neural Tree์˜ ์‹œ์Šคํ…œ ์ƒํƒœ ์ •๋ณด๋ฅผ MQTT๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ Orchestration Server๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ „์†กํ•œ๋‹ค.


2. ์‹œ์Šคํ…œ ๊ตฌ์„ฑ

External Orchestration Server
          โ”‚
          โ”‚ MQTT
          โ–ผ
     Mosquitto Broker
      jscouple.site
          โ”‚
          โ–ผ
       Raspberry Pi
ai_neural_tree_control.py
          โ”‚
          โ”‚ USB Serial
          โ–ผ
        Arduino
          โ”‚
     โ”Œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”
     โ”‚    โ”‚    โ”‚
     โ–ผ    โ–ผ    โ–ผ
    D6   D5   D4
   Relay RED GREEN
     โ”‚
     โ–ผ
AI Neural Tree

3. MQTT Broker

ํ•ญ๋ชฉ ๊ฐ’
Broker jscouple.site
Port 1883
Protocol MQTT
Authentication Username / Password
QoS 1

4. MQTT Topic

AI Neural Tree์˜ ๊ธฐ๋ณธ Topic Prefix๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

diorama/ainueraltree/

Topic ๋ชฉ๋ก

Topic ๋ฐฉํ–ฅ ์„ค๋ช…
diorama/ainueraltree/led Orchestration โ†’ AI Neural Tree Neural Tree ์ „์› ์ œ์–ด
diorama/ainueraltree/status AI Neural Tree โ†’ Orchestration Neural Tree ์ƒํƒœ์ •๋ณด ์ „์†ก

Mosquitto ACL

topic readwrite diorama/ainueraltree/#

5. Command

Command ๋ชฉ๋ก

Command ์„ค๋ช…
LED_ON AI Neural Tree ์ „์ฒด ์ „์› ON
LED_OFF AI Neural Tree ์ „์ฒด ์ „์› OFF

5.1 LED_ON

AI Neural Tree ์ „์ฒด ์ „์›์„ ONํ•˜๊ณ  ์ƒํƒœ ํ‘œ์‹œ LED๋ฅผ GREEN์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

Topic

diorama/ainueraltree/led

Payload

{
  "command": "LED_ON"
}

๋™์ž‘

AI Neural Tree Power โ†’ ON
D6 Relay             โ†’ ON
D5 RED               โ†’ OFF
D4 GREEN             โ†’ ON

5.2 LED_OFF

AI Neural Tree ์ „์ฒด ์ „์›์„ OFFํ•˜๊ณ  ์ƒํƒœ ํ‘œ์‹œ LED๋ฅผ RED๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

Topic

diorama/ainueraltree/led

Payload

{
  "command": "LED_OFF"
}

๋™์ž‘

AI Neural Tree Power โ†’ OFF
D6 Relay             โ†’ OFF
D5 RED               โ†’ ON
D4 GREEN             โ†’ OFF

6. Arduino PIN ์ •์˜

Arduino PIN ์žฅ์น˜ ๊ธฐ๋Šฅ
D6 Relay AI Neural Tree ์ „์ฒด ์ „์›
D5 RED LED ๋Œ€๊ธฐ / ์ด๋ฒคํŠธ ์ข…๋ฃŒ ์ƒํƒœ
D4 GREEN LED ์ด๋ฒคํŠธ ์‹คํ–‰ ์ƒํƒœ

Relay ์ œ์–ด ๊ธฐ์ค€:

HIGH = Tree Power ON
LOW  = Tree Power OFF

7. AI Neural Tree ์ƒํƒœ

์ƒํƒœ Tree Power D5 RED D4 GREEN
์ดˆ๊ธฐ / ๋Œ€๊ธฐ OFF ON OFF
์ด๋ฒคํŠธ ์‹คํ–‰ ON OFF ON
์ด๋ฒคํŠธ ์ข…๋ฃŒ OFF ON OFF

Raspberry Pi ๋ฐ Arduino๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ๊ธฐ๋ณธ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Tree Power : OFF
RED        : ON
GREEN      : OFF

8. STATUS

AI Neural Tree๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€ Orchestration Server๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ „์†กํ•œ๋‹ค.

Topic

diorama/ainueraltree/status

์ „์†ก ์„ค์ •

ํ•ญ๋ชฉ ๊ฐ’
์ „์†ก ์ฃผ๊ธฐ 2์ดˆ
QoS 1
Retain true

Retain=true๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Orchestration Server๊ฐ€ MQTT Broker์— ์ƒˆ๋กญ๊ฒŒ ์—ฐ๊ฒฐ๋˜๋”๋ผ๋„ ๋งˆ์ง€๋ง‰ AI Neural Tree ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


9. STATUS Payload

{
  "device": "AI_NEURAL_TREE",
  "hub_status": "ONLINE",
  "tree_power": "OFF",
  "ai_status": "READY",
  "connected_devices": 8,
  "active_scenario": "NONE",
  "current_task": "IDLE",
  "processed_commands": 152,
  "mqtt_messages": 1284,
  "avg_response_time_ms": 82,
  "cpu_percent": 34.0,
  "memory_percent": 46.0,
  "timestamp": "2026-10-01T18:58:31+09:00"
}

10. STATUS ํ•„๋“œ ์ •์˜

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช… ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๋ฐฉ์‹
device string ์žฅ์น˜ ์‹๋ณ„์ž ๊ณ ์ •
hub_status string AI Hub ์ƒํƒœ ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ
tree_power string Neural Tree ์ „์› ์ƒํƒœ ์‹ค์ œ ์ œ์–ด ์ƒํƒœ
ai_status string AI ์ฒ˜๋ฆฌ ์ƒํƒœ Simulation
connected_devices integer ์—ฐ๊ฒฐ๋œ ๋””๋ฐ”์ด์Šค ์ˆ˜ Simulation
active_scenario string ํ˜„์žฌ ํ™œ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค Simulation
current_task string ํ˜„์žฌ ์ฒ˜๋ฆฌ Task Simulation
processed_commands integer ์ฒ˜๋ฆฌํ•œ ๋ช…๋ น ๋ˆ„์  ์ˆ˜ ์‹ค์ œ ์นด์šดํŠธ
mqtt_messages integer MQTT ๋ฉ”์‹œ์ง€ ๋ˆ„์  ์ˆ˜ ์‹ค์ œ ์นด์šดํŠธ
avg_response_time_ms integer ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„(ms) Simulation
cpu_percent float Raspberry Pi CPU ์‚ฌ์šฉ๋ฅ  ์‹ค์ œ ์ธก์ •
memory_percent float Raspberry Pi Memory ์‚ฌ์šฉ๋ฅ  ์‹ค์ œ ์ธก์ •
timestamp string ์ƒํƒœ ์ƒ์„ฑ ์‹œ๊ฐ„ ์‹ค์ œ ์‹œ๊ฐ„

11. Hub Status

๊ฐ’ ์„ค๋ช…
ONLINE AI Neural Tree Hub ์ •์ƒ ๋™์ž‘
OFFLINE AI Neural Tree Hub ์—ฐ๊ฒฐ ์ข…๋ฃŒ

12. AI Status

๊ฐ’ ์„ค๋ช…
READY ๋ช…๋ น ๋Œ€๊ธฐ ์ƒํƒœ
PROCESSING ์‹œ๋‚˜๋ฆฌ์˜ค ๋˜๋Š” Task ์ฒ˜๋ฆฌ ์ค‘

์ด๋ฒคํŠธ ์‹œ์ž‘:

READY
  โ”‚
  โ–ผ
PROCESSING

์ด๋ฒคํŠธ ์ข…๋ฃŒ:

PROCESSING
  โ”‚
  โ–ผ
READY

13. Active Scenario

Simulation ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ’ ์„ค๋ช…
DRONE_DELIVERY ๋“œ๋ก  ๋ฐฐ์†ก ์‹œ๋‚˜๋ฆฌ์˜ค
SMART_FACTORY ์Šค๋งˆํŠธํŒฉํ† ๋ฆฌ ์‹œ๋‚˜๋ฆฌ์˜ค
HYDROGEN_CHARGING ์ˆ˜์†Œ ์ถฉ์ „ ์‹œ๋‚˜๋ฆฌ์˜ค
AUTONOMOUS_DRIVING ์ž์œจ์ฃผํ–‰ ์‹œ๋‚˜๋ฆฌ์˜ค
NONE ํ™œ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค ์—†์Œ

Tree OFF ์ƒํƒœ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

NONE

14. Current Task

Simulation ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ Task ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ’ ์„ค๋ช…
ROUTE_PLANNING ์ด๋™ ๊ฒฝ๋กœ ์ƒ์„ฑ
DATA_ANALYSIS ๋ฐ์ดํ„ฐ ๋ถ„์„
DEVICE_CONTROL Physical Device ์ œ์–ด
TASK_PLANNING Task ๊ณ„ํš
IDLE ๋Œ€๊ธฐ

Tree OFF ์ƒํƒœ์—์„œ๋Š” ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

IDLE

15. ์‹ค์ œ ๋ฐ์ดํ„ฐ / Simulation Data

ํ˜„์žฌ AI Neural Tree์—์„œ๋Š” ์‹ค์ œ๋กœ ์ทจ๋“ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ์™€ Simulation Data๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ๋ฐฉ์‹
Hub Status ์‹ค์ œ
Tree Power ์‹ค์ œ
CPU ์‹ค์ œ
Memory ์‹ค์ œ
Processed Commands ์‹ค์ œ
MQTT Messages ์‹ค์ œ
AI Status Simulation
Connected Devices Simulation
Active Scenario Simulation
Current Task Simulation
Average Response Time Simulation

16. MQTT ํ…Œ์ŠคํŠธ

AI Neural Tree ON

mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P 'PASSWORD' \
-t "diorama/ainueraltree/led" \
-m '{"command":"LED_ON"}'

๋™์ž‘ ๊ฒฐ๊ณผ:

Tree Power โ†’ ON
RED        โ†’ OFF
GREEN      โ†’ ON
AI Status  โ†’ PROCESSING

AI Neural Tree OFF

mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P 'PASSWORD' \
-t "diorama/ainueraltree/led" \
-m '{"command":"LED_OFF"}'

๋™์ž‘ ๊ฒฐ๊ณผ:

Tree Power โ†’ OFF
RED        โ†’ ON
GREEN      โ†’ OFF
AI Status  โ†’ READY

17. STATUS ์ˆ˜์‹  ํ™•์ธ

AI Neural Tree์—์„œ ์ „์†กํ•˜๋Š” STATUS๋งŒ ํ™•์ธ:

mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P 'PASSWORD' \
-t "diorama/ainueraltree/status" \
-v

AI Neural Tree์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „์ฒด MQTT Topic ํ™•์ธ:

mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P 'PASSWORD' \
-t "diorama/ainueraltree/#" \
-v

18. Raspberry Pi ํ”„๋กœ๊ทธ๋žจ

AI Neural Tree ์ œ์–ด ํ”„๋กœ๊ทธ๋žจ:

/home/zer01ne/ai_neural_tree_control.py

์ฃผ์š” ๊ธฐ๋Šฅ:

MQTT Broker ์—ฐ๊ฒฐ
        โ”‚
        โ”œโ”€โ”€ diorama/ainueraltree/led Subscribe
        โ”‚
        โ”œโ”€โ”€ LED_ON / LED_OFF ๋ช…๋ น ์ฒ˜๋ฆฌ
        โ”‚
        โ”œโ”€โ”€ Arduino Serial ์ œ์–ด
        โ”‚
        โ”œโ”€โ”€ Raspberry Pi CPU / Memory ์ธก์ •
        โ”‚
        โ”œโ”€โ”€ Simulation Data ์ƒ์„ฑ
        โ”‚
        โ””โ”€โ”€ diorama/ainueraltree/status Publish

19. Raspberry Pi ์ž๋™ ์‹คํ–‰

AI Neural Tree ์ œ์–ด ํ”„๋กœ๊ทธ๋žจ์€ Raspberry Pi ๋ถ€ํŒ… ์‹œ systemd๋ฅผ ํ†ตํ•ด ์ž๋™ ์‹คํ–‰ํ•œ๋‹ค.

Service ์ด๋ฆ„

ai-neural-tree.service

Service ํŒŒ์ผ

/etc/systemd/system/ai-neural-tree.service

Service ์„ค์ •

[Unit]
Description=AI Neural Tree MQTT Controller
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=zer01ne
WorkingDirectory=/home/zer01ne
ExecStart=/usr/bin/python3 /home/zer01ne/ai_neural_tree_control.py
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

20. Service ๋“ฑ๋ก

systemd ์„ค์ • ๋ฐ˜์˜:

sudo systemctl daemon-reload

๋ถ€ํŒ… ์ž๋™ ์‹คํ–‰ ๋“ฑ๋ก:

sudo systemctl enable ai-neural-tree.service

์„œ๋น„์Šค ์‹œ์ž‘:

sudo systemctl start ai-neural-tree.service

21. Service ๊ด€๋ฆฌ

์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ:

sudo systemctl status ai-neural-tree.service

์„œ๋น„์Šค ์žฌ์‹œ์ž‘:

sudo systemctl restart ai-neural-tree.service

์„œ๋น„์Šค ์ค‘์ง€:

sudo systemctl stop ai-neural-tree.service

์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ํ™•์ธ:

journalctl -u ai-neural-tree.service -f

22. ์ „์ฒด ๋™์ž‘ ํ๋ฆ„

Raspberry Pi Power ON
        โ”‚
        โ–ผ
systemd
        โ”‚
        โ–ผ
ai-neural-tree.service
        โ”‚
        โ–ผ
ai_neural_tree_control.py
        โ”‚
        โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚                              โ”‚
        โ–ผ                              โ–ผ
MQTT Subscribe                    STATUS ์ƒ์„ฑ
        โ”‚                              โ”‚
        โ–ผ                              โ”‚
diorama/ainueraltree/led               โ”‚
        โ”‚                              โ”‚
        โ–ผ                              โ”‚
LED_ON / LED_OFF                       โ”‚
        โ”‚                              โ”‚
        โ–ผ                              โ”‚
Arduino Serial                         โ”‚
        โ”‚                              โ”‚
        โ–ผ                              โ”‚
D6 Relay                               โ”‚
D5 RED                                 โ”‚
D4 GREEN                               โ”‚
        โ”‚                              โ”‚
        โ–ผ                              โ–ผ
AI Neural Tree              diorama/ainueraltree/status
                                       โ”‚
                                       โ–ผ
                            External Orchestration Server

23. ์ตœ์ข… MQTT Interface

๊ธฐ๋Šฅ Topic ๋ฐฉํ–ฅ QoS Retain
Neural Tree ์ „์› ์ œ์–ด diorama/ainueraltree/led Orchestration โ†’ Tree 1 No
Neural Tree ์ƒํƒœ์ •๋ณด diorama/ainueraltree/status Tree โ†’ Orchestration 1 Yes

24. ์ตœ์ข… ๊ตฌ์„ฑ

AI Neural Tree๋Š” ์™ธ๋ถ€ Orchestration Server๋กœ๋ถ€ํ„ฐ MQTT ์ œ์–ด ๋ช…๋ น์„ ์ˆ˜์‹ ํ•˜์—ฌ ๋ฌผ๋ฆฌ์ ์ธ Neural Tree ์ „์›๊ณผ ์ƒํƒœ LED๋ฅผ ์ œ์–ดํ•œ๋‹ค.

๋™์‹œ์— Raspberry Pi์˜ ์‹ค์ œ ์‹œ์Šคํ…œ ์ •๋ณด์™€ Simulation Data๋ฅผ ์กฐํ•ฉํ•˜์—ฌ AI Neural Tree์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€ Orchestration Server๋กœ ์ง€์†์ ์œผ๋กœ ์ „์†กํ•œ๋‹ค.

Orchestration
      โ”‚
      โ”‚ LED_ON / LED_OFF
      โ–ผ
MQTT Broker
      โ”‚
      โ–ผ
AI Neural Tree
      โ”‚
      โ”œโ”€โ”€ Tree Power Control
      โ”œโ”€โ”€ RED / GREEN Status
      โ”‚
      โ””โ”€โ”€ Status Data
              โ”‚
              โ–ผ
         MQTT Broker
              โ”‚
              โ–ผ
        Orchestration

Smart Factory ๊ตฌํ˜„ ๋ช…์„ธ

1. ๊ฐœ์š”

Smart Factory ๋””์˜ค๋ผ๋งˆ๋Š” Physical AI Orchestration Server๋กœ๋ถ€ํ„ฐ MQTT ๋ช…๋ น์„ ์ˆ˜์‹ ํ•˜์—ฌ ์ƒ์‚ฐ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

Raspberry Pi๊ฐ€ Smart Factory์˜ ์ค‘์•™ ์ œ์–ด Hub ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋‹ค์Œ ์žฅ์น˜๋ฅผ ํ†ตํ•ฉ ์ œ์–ดํ•œ๋‹ค.

  • LED Arduino
  • ๋Œ€ํ˜• Conveyor Arduino + Relay
  • ACEBOTT ESP32
  • ์†Œํ˜• Conveyor
  • Robot Arm

์ƒ์‚ฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ์ด๋ฒคํŠธ ํ‘œ์‹œ LED๊ฐ€ GREEN์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ , ๋Œ€ํ˜• Conveyor์™€ ESP32 ๊ธฐ๋ฐ˜ ์†Œํ˜• Conveyor ๋ฐ Robot Arm์ด ์ˆœ์ฐจ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

Robot Arm ๋™์ž‘์ด ์™„๋ฃŒ๋˜๋ฉด ๋ชจ๋“  ๋ฌผ๋ฆฌ ์žฅ์น˜๋ฅผ ์ •์ง€ํ•œ ํ›„ LED๋ฅผ RED ์ƒํƒœ๋กœ ๋ณต๊ท€ํ•œ๋‹ค.


2. ์‹œ์Šคํ…œ ๊ตฌ์„ฑ

Physical AI Orchestration Server
            โ”‚
            โ”‚ MQTT
            โ–ผ
      Raspberry Pi
  Smart Factory Controller
            โ”‚
            โ”œโ”€โ”€ LED Arduino
            โ”‚     โ”œโ”€โ”€ RED LED
            โ”‚     โ””โ”€โ”€ GREEN LED
            โ”‚
            โ”œโ”€โ”€ Large Conveyor Arduino
            โ”‚     โ””โ”€โ”€ Relay
            โ”‚           โ””โ”€โ”€ Large Conveyor
            โ”‚
            โ””โ”€โ”€ ACEBOTT ESP32
                  โ”œโ”€โ”€ Small Conveyor
                  โ””โ”€โ”€ Robot Arm

Raspberry Pi์—์„œ ์‹คํ–‰๋˜๋Š” Smart Factory ์ œ์–ด ํ”„๋กœ๊ทธ๋žจ:

/home/zer01ne/smartfactory_control.py

3. MQTT Broker

ํ•ญ๋ชฉ ๊ฐ’
Broker jscouple.site
Port 1883
Protocol MQTT
QoS 1
Authentication ID / Password ์ธ์ฆ

4. MQTT Topic

๊ตฌ๋ถ„ Topic ๋ฐฉํ–ฅ Retain ์„ค๋ช…
REQUEST diorama/smartfactory/request Orchestration โ†’ Smart Factory No ์ œ์–ด ๋ช…๋ น ์ˆ˜์‹ 
RESPONSE diorama/smartfactory/response Smart Factory โ†’ Orchestration No ๋ช…๋ น ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ
STATUS diorama/smartfactory/status Smart Factory โ†’ Orchestration Yes ํ˜„์žฌ ์‹œ์Šคํ…œ ์ƒํƒœ
TELEMETRY diorama/smartfactory/telemetry Smart Factory โ†’ Orchestration No Smart Factory ์šด์˜ ์ •๋ณด

5. Command

Smart Factory์˜ ๊ณต์‹ ์ œ์–ด Command๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Command ์„ค๋ช…
START_SCENARIO ์ƒ์‚ฐ ์ด๋ฒคํŠธ ์‹œ์ž‘
STOP_SCENARIO ์ƒ์‚ฐ ์ด๋ฒคํŠธ ์ค‘์ง€
STATUS_REQUEST ํ˜„์žฌ ์ƒ์‚ฐ ๋ฐ ์žฅ์น˜ ์ƒํƒœ ์š”์ฒญ
LED_ON Smart Factory ์ด๋ฒคํŠธ LED GREEN ON
LED_OFF Smart Factory ์ด๋ฒคํŠธ LED GREEN OFF / RED ON

LED_ON, LED_OFF ๋ช…๋ น์€ Robot Arm ๋ฐ Conveyor๋ฅผ ๋™์ž‘์‹œํ‚ค์ง€ ์•Š๊ณ  LED๋งŒ ๋…๋ฆฝ์ ์œผ๋กœ ์ œ์–ดํ•œ๋‹ค.


6. REQUEST

Topic

diorama/smartfactory/request

Payload

{
  "session_id": "SESSION-20261001-0001",
  "scenario_id": "SCN-SF-001",
  "command": "START_SCENARIO",
  "target": "SMART_FACTORY",
  "payload": {},
  "timestamp": "2026-10-01T17:00:00+09:00"
}

REQUEST ํ•„๋“œ ์ •์˜

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
session_id string Y Orchestration Server์˜ ์‹คํ–‰ ์„ธ์…˜ ์‹๋ณ„์ž
scenario_id string Y ์‹คํ–‰ ์‹œ๋‚˜๋ฆฌ์˜ค ์‹๋ณ„์ž
command string Y Smart Factory ์ œ์–ด ๋ช…๋ น
target string Y ์ œ์–ด ๋Œ€์ƒ. SMART_FACTORY
payload object Y Command๋ณ„ ์ถ”๊ฐ€ ์ „๋‹ฌ ๋ฐ์ดํ„ฐ
timestamp string Y ์š”์ฒญ ์ƒ์„ฑ ์‹œ๊ฐ. ISO 8601 ํ˜•์‹

scenario_id๋Š” Orchestration Server์—์„œ ์ƒ์„ฑํ•œ UUID ๋˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์ •์˜ํ•œ ๊ณ ์œ  ์‹œ๋‚˜๋ฆฌ์˜ค ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ:

SCN-SF-001

๋˜๋Š”:

550e8400-e29b-41d4-a716-446655440000

7. START_SCENARIO

์ƒ์‚ฐ ์ด๋ฒคํŠธ ์ „์ฒด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

REQUEST

{
  "session_id": "SESSION-20261001-0001",
  "scenario_id": "SCN-SF-001",
  "command": "START_SCENARIO",
  "target": "SMART_FACTORY",
  "payload": {},
  "timestamp": "2026-10-01T17:00:00+09:00"
}

๋™์ž‘ ์ˆœ์„œ

START_SCENARIO
      โ”‚
      โ–ผ
LED GREEN ON
      โ”‚
      โ–ผ
Large Conveyor ON
      โ”‚
      โ–ผ
ESP32 START_EVENT
      โ”‚
      โ–ผ
Small Conveyor ์™•๋ณต ๋™์ž‘
      โ”‚
      โ–ผ
Robot Arm 1์ฐจ ๋™์ž‘
      โ”‚
      โ–ผ
Robot Arm 2์ฐจ ๋™์ž‘
      โ”‚
      โ–ผ
Robot Arm HOME
      โ”‚
      โ–ผ
ESP32 EVENT_COMPLETE
      โ”‚
      โ–ผ
Robot Arm ์•ˆ์ •ํ™” ๋Œ€๊ธฐ
      โ”‚
      โ–ผ
Large Conveyor OFF
      โ”‚
      โ–ผ
๋ฌผ๋ฆฌ ์žฅ์น˜ ๋™์ž‘ ์™„๋ฃŒ
      โ”‚
      โ–ผ
LED GREEN OFF
LED RED ON
      โ”‚
      โ–ผ
STATUS COMPLETE
      โ”‚
      โ–ผ
RESPONSE SUCCESS

8. STOP_SCENARIO

์‹คํ–‰ ์ค‘์ธ Smart Factory ์ƒ์‚ฐ ์ด๋ฒคํŠธ์˜ ์ข…๋ฃŒ๋ฅผ ์š”์ฒญํ•œ๋‹ค.

REQUEST

{
  "session_id": "SESSION-20261001-0002",
  "scenario_id": "SCN-SF-001",
  "command": "STOP_SCENARIO",
  "target": "SMART_FACTORY",
  "payload": {},
  "timestamp": "2026-10-01T17:01:00+09:00"
}

๋™์ž‘

Large Conveyor OFF
ESP32 STOP_EVENT
LED GREEN OFF
LED RED ON
Factory State โ†’ READY

9. STATUS_REQUEST

ํ˜„์žฌ Smart Factory ์ƒํƒœ๋ฅผ ์š”์ฒญํ•œ๋‹ค.

REQUEST

{
  "session_id": "SESSION-20261001-0003",
  "scenario_id": "SCN-SF-001",
  "command": "STATUS_REQUEST",
  "target": "SMART_FACTORY",
  "payload": {},
  "timestamp": "2026-10-01T17:02:00+09:00"
}

์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๋ฉด ํ˜„์žฌ ์ƒํƒœ๋ฅผ STATUS Topic๊ณผ RESPONSE Topic์œผ๋กœ ์ „์†กํ•œ๋‹ค.


10. LED_ON

Smart Factory์˜ ์ด๋ฒคํŠธ LED๋งŒ ๋…๋ฆฝ์ ์œผ๋กœ GREEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

Robot Arm๊ณผ Conveyor๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

REQUEST

{
  "session_id": "SESSION-20261001-0004",
  "scenario_id": "SCN-SF-LED-001",
  "command": "LED_ON",
  "target": "SMART_FACTORY",
  "payload": {},
  "timestamp": "2026-10-01T17:03:00+09:00"
}

๋™์ž‘

RED LED OFF
GREEN LED ON

11. LED_OFF

Smart Factory ์ด๋ฒคํŠธ LED๋ฅผ ํ‰์ƒ์‹œ ์ƒํƒœ๋กœ ๋ณต๊ท€์‹œํ‚จ๋‹ค.

Robot Arm๊ณผ Conveyor์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

REQUEST

{
  "session_id": "SESSION-20261001-0005",
  "scenario_id": "SCN-SF-LED-001",
  "command": "LED_OFF",
  "target": "SMART_FACTORY",
  "payload": {},
  "timestamp": "2026-10-01T17:04:00+09:00"
}

๋™์ž‘

GREEN LED OFF
RED LED ON

12. RESPONSE

Topic

diorama/smartfactory/response

Smart Factory๋Š” ๋ช…๋ น ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ RESPONSE Topic์œผ๋กœ ์ „์†กํ•œ๋‹ค.

SUCCESS ์˜ˆ์‹œ

{
  "session_id": "SESSION-20261001-0001",
  "scenario_id": "SCN-SF-001",
  "command": "START_SCENARIO",
  "target": "SMART_FACTORY",
  "result": "SUCCESS",
  "message": "SMART FACTORY EVENT COMPLETE",
  "payload": {
    "factory": "READY",
    "event_running": false,
    "event_step": "COMPLETE",
    "event_progress": 100,
    "led": "RED",
    "large_conveyor": "STOPPED",
    "small_conveyor": "STOPPED",
    "robot_arm": "IDLE",
    "robot_run_count": 2
  },
  "timestamp": "2026-10-01T17:05:00+09:00"
}

RESPONSE ํ•„๋“œ ์ •์˜

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…
session_id string REQUEST์˜ Session ID
scenario_id string REQUEST์˜ Scenario ID
command string ์ˆ˜ํ–‰ํ•œ Command
target string SMART_FACTORY
result string ๋ช…๋ น ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ SUCCESS / FAIL
message string ๋ช…๋ น ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€
payload object ๋ช…๋ น ์ฒ˜๋ฆฌ ํ›„ Smart Factory ์ƒํƒœ
timestamp string ์‘๋‹ต ์ƒ์„ฑ ์‹œ๊ฐ

13. STATUS

Topic

diorama/smartfactory/status

STATUS๋Š” Smart Factory์˜ ํ˜„์žฌ ์ œ์–ด ์ƒํƒœ์™€ ์žฅ์น˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

STATUS ๋ฉ”์‹œ์ง€๋Š” Retained Message๋กœ ๋ฐœํ–‰ํ•˜๋ฉฐ ๊ธฐ๋ณธ ๋ฐœํ–‰ ์ฃผ๊ธฐ๋Š” 10์ดˆ์ด๋‹ค. ์ฃผ์š” ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ์—๋„ ๋ฐœํ–‰ํ•œ๋‹ค.

STATUS ์˜ˆ์‹œ

{
  "target": "SMART_FACTORY",
  "connection": "ONLINE",
  "factory": "OPERATING",
  "event_running": true,
  "event_step": "ROBOT_ARM_RUN_1",
  "event_progress": 40,
  "led": {
    "state": "GREEN",
    "connection": "ONLINE"
  },
  "large_conveyor": {
    "state": "RUNNING",
    "connection": "ONLINE"
  },
  "small_conveyor": {
    "state": "RUNNING"
  },
  "robot_arm": {
    "state": "RUN_1",
    "run_count": 0
  },
  "esp32": {
    "connection": "ONLINE"
  },
  "production_completed": 18,
  "last_error": "",
  "timestamp": "2026-10-01T17:00:10+09:00"
}

STATUS ์ฃผ์š” ํ•„๋“œ

ํ•„๋“œ ๊ฐ’ ์˜ˆ์‹œ ์„ค๋ช…
connection ONLINE Smart Factory Hub ์ƒํƒœ
factory READY, OPERATING, ERROR ๊ณต์žฅ ์ œ์–ด ์ƒํƒœ
event_running true, false ์ด๋ฒคํŠธ ์‹คํ–‰ ์—ฌ๋ถ€
event_step READY, ROBOT_ARM_RUN_1, COMPLETE ํ˜„์žฌ ์ด๋ฒคํŠธ ๋‹จ๊ณ„
event_progress 0~100 ์ด๋ฒคํŠธ ์ง„ํ–‰๋ฅ 
led.state RED, GREEN ์ด๋ฒคํŠธ LED ์ƒํƒœ
large_conveyor.state RUNNING, STOPPED ๋Œ€ํ˜• Conveyor ์ƒํƒœ
small_conveyor.state RUNNING, STOPPED ์†Œํ˜• Conveyor ์ƒํƒœ
robot_arm.state IDLE, RUN_1, RUN_2, RETURN_HOME Robot Arm ์ƒํƒœ
robot_arm.run_count 0~2 Robot Arm ์™„๋ฃŒ ํšŸ์ˆ˜
last_error string ๋งˆ์ง€๋ง‰ ์˜ค๋ฅ˜ ์ •๋ณด

14. TELEMETRY

Topic

diorama/smartfactory/telemetry

Smart Factory์˜ ์ƒ์‚ฐ ๋ฐ ์šด์˜ ์ •๋ณด๋ฅผ Orchestration Server๋กœ ์ „์†กํ•œ๋‹ค.

๊ธฐ๋ณธ ์ „์†ก ์ฃผ๊ธฐ๋Š” 3์ดˆ์ด๋‹ค.

TELEMETRY ์˜ˆ์‹œ

{
  "target": "SMART_FACTORY",
  "factory": {
    "status": "RUNNING"
  },
  "production": {
    "progress_percent": 72,
    "completed": 18,
    "target": 25
  },
  "robot_arm": {
    "status": "ASSEMBLING"
  },
  "conveyor": {
    "status": "RUNNING",
    "speed_percent": 65
  },
  "quality": {
    "result": "PASS",
    "defect_rate_percent": 1.2
  },
  "energy": {
    "power_kw": 2.4
  },
  "environment": {
    "temperature_c": 25.3
  },
  "devices": {
    "led_arduino": "ONLINE",
    "large_conveyor": "ONLINE",
    "acebott_esp32": "ONLINE"
  },
  "event": {
    "running": true,
    "step": "ROBOT_ARM_RUN_1",
    "progress": 40
  },
  "timestamp": "2026-10-01T17:00:12+09:00"
}

15. Smart Factory ์†ก์‹  ๋ฐ์ดํ„ฐ

๊ตฌ๋ถ„ ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ ์„ค๋ช…
๊ณต์žฅ ๊ฐ€๋™ ์ƒํƒœ RUNNING Smart Factory ๊ฐ€๋™ ์ƒํƒœ
์ƒ์‚ฐ ์ƒ์‚ฐ ์ง„ํ–‰๋ฅ  72 % ์ƒ์‚ฐ ์ด๋ฒคํŠธ ์ง„ํ–‰ ์ •๋ณด
์ƒ์‚ฐ ์ƒ์‚ฐ ์ˆ˜๋Ÿ‰ 18 / 25 ์™„๋ฃŒ ์ˆ˜๋Ÿ‰ / ๋ชฉํ‘œ ์ˆ˜๋Ÿ‰
Robot Arm ์ƒํƒœ ASSEMBLING Robot Arm ์ž‘์—… ์ƒํƒœ
Conveyor ์ƒํƒœ RUNNING Conveyor ๋™์ž‘ ์ƒํƒœ
Conveyor ์†๋„ 65 % Conveyor ์šด์˜ ์†๋„
ํ’ˆ์งˆ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ PASS ํ’ˆ์งˆ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ
ํ’ˆ์งˆ ๋ถˆ๋Ÿ‰๋ฅ  1.2 % ์ƒ์‚ฐ ํ’ˆ์งˆ ์šด์˜ ์ •๋ณด
์—๋„ˆ์ง€ ์ „๋ ฅ ์‚ฌ์šฉ๋Ÿ‰ 2.4 kW ๊ณต์žฅ ์ „๋ ฅ ์‚ฌ์šฉ ์ •๋ณด
ํ™˜๊ฒฝ ๊ณต์žฅ ์˜จ๋„ 25.3 ยฐC ๊ณต์žฅ ํ™˜๊ฒฝ ์˜จ๋„
์žฅ์น˜ LED Arduino ONLINE LED Controller ์—ฐ๊ฒฐ ์ƒํƒœ
์žฅ์น˜ Large Conveyor ONLINE ๋Œ€ํ˜• Conveyor Controller ์—ฐ๊ฒฐ ์ƒํƒœ
์žฅ์น˜ ACEBOTT ESP32 ONLINE Robot Arm Controller ์—ฐ๊ฒฐ ์ƒํƒœ
์ด๋ฒคํŠธ ์‹คํ–‰ ์ƒํƒœ true ํ˜„์žฌ ์ด๋ฒคํŠธ ์‹คํ–‰ ์—ฌ๋ถ€
์ด๋ฒคํŠธ ์ด๋ฒคํŠธ ๋‹จ๊ณ„ ROBOT_ARM_RUN_1 ํ˜„์žฌ ์‹œ๋‚˜๋ฆฌ์˜ค ์‹คํ–‰ ๋‹จ๊ณ„
์ด๋ฒคํŠธ ์ง„ํ–‰๋ฅ  40 ํ˜„์žฌ ์‹œ๋‚˜๋ฆฌ์˜ค ์ง„ํ–‰๋ฅ 

16. EVENT STEP

Event Step Progress ์„ค๋ช…
READY 0 ์ด๋ฒคํŠธ ๋Œ€๊ธฐ
EVENT_START 5 ์ด๋ฒคํŠธ ์‹œ์ž‘
LED_GREEN 10 GREEN LED ํ™œ์„ฑํ™”
LARGE_CONVEYOR_RUNNING 15 ๋Œ€ํ˜• Conveyor ๋™์ž‘
ESP32_COMMAND_RECEIVED 22 ESP32 ์ด๋ฒคํŠธ ๋ช…๋ น ์ˆ˜์‹ 
ESP32_EVENT_RUNNING 25 ESP32 ์ด๋ฒคํŠธ ์‹œ์ž‘
SMALL_CONVEYOR_RUNNING 30 ์†Œํ˜• Conveyor ๋™์ž‘
ROBOT_ARM_RUN_1 40 Robot Arm 1์ฐจ ์ž‘์—…
ROBOT_RUN_1_COMPLETE 55 Robot Arm 1์ฐจ ์ž‘์—… ์™„๋ฃŒ
ROBOT_ARM_RUN_2 65 Robot Arm 2์ฐจ ์ž‘์—…
ROBOT_RUN_2_COMPLETE 85 Robot Arm 2์ฐจ ์ž‘์—… ์™„๋ฃŒ
FINAL_HOME 90 Robot Arm ์›์œ„์น˜ ๋ณต๊ท€
ESP32_COMPLETE 95 ESP32 ์ด๋ฒคํŠธ ์™„๋ฃŒ
ROBOT_COMPLETE_WAIT 96 Robot Arm ์•ˆ์ •ํ™”
LARGE_CONVEYOR_STOPPED 98 ๋Œ€ํ˜• Conveyor ์ข…๋ฃŒ
COMPLETE 100 ์ „์ฒด ์ƒ์‚ฐ ์ด๋ฒคํŠธ ์™„๋ฃŒ
ERROR - ์ด๋ฒคํŠธ ์˜ค๋ฅ˜

17. Raspberry Pi - Arduino / ESP32 ์—ฐ๊ฒฐ

Smart Factory๋Š” USB Serial ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์žฅ์น˜ ๋ฒˆํ˜ธ๊ฐ€ ์žฌ๋ถ€ํŒ… ์‹œ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด /dev/ttyUSB0 ๋ฐฉ์‹ ๋Œ€์‹  /dev/serial/by-path/ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์žฅ์น˜ ๋ฌผ๋ฆฌ USB Serial ์„ค์ •
ACEBOTT ESP32 USB 1.1 115200 bps
LED Arduino USB 1.2 9600 bps
Large Conveyor Arduino USB 1.3 9600 bps

ACEBOTT ESP32

/dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0-port0

LED Arduino

/dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.2:1.0

Large Conveyor Arduino

/dev/serial/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.3:1.0-port0

18. LED ๋™์ž‘

์ƒํƒœ RED GREEN
ํ‰์ƒ์‹œ ON OFF
์ด๋ฒคํŠธ ์‹คํ–‰ OFF ON
์ด๋ฒคํŠธ ์™„๋ฃŒ ON OFF

Arduino Pin:

D6 = RED
D7 = GREEN

19. ESP32 ์ œ์–ด Command

Raspberry Pi์™€ ACEBOTT ESP32 ์‚ฌ์ด์—์„œ๋Š” USB Serial Command๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Command ์„ค๋ช…
START_EVENT Smart Factory Robot/Conveyor ์ด๋ฒคํŠธ ์‹œ์ž‘
STOP_EVENT ์ด๋ฒคํŠธ ์ข…๋ฃŒ ์š”์ฒญ
STATUS ESP32 ์ƒํƒœ ์š”์ฒญ
PING ESP32 ํ†ต์‹  ํ™•์ธ

ESP32๋Š” ์ „์ฒด ์ƒ์‚ฐ ๋™์ž‘ ์™„๋ฃŒ ํ›„ ๋‹ค์Œ ๋ฉ”์‹œ์ง€๋ฅผ Raspberry Pi๋กœ ์ „์†กํ•œ๋‹ค.

EVENT_COMPLETE

Raspberry Pi๋Š” EVENT_COMPLETE๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„ Robot Arm์˜ ์ตœ์ข… ๋™์ž‘ ์•ˆ์ •ํ™” ์‹œ๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ  ๋Œ€ํ˜• Conveyor์™€ LED๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ข…๋ฃŒํ•œ๋‹ค.


20. ์ž๋™ ์‹คํ–‰

Smart Factory Controller๋Š” Raspberry Pi ๋ถ€ํŒ… ์‹œ systemd๋ฅผ ํ†ตํ•ด ์ž๋™ ์‹คํ–‰ํ•œ๋‹ค.

Service:

smartfactory.service

์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ:

/home/zer01ne/smartfactory_control.py

์ƒํƒœ ํ™•์ธ:

systemctl status smartfactory.service

์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ:

journalctl -u smartfactory.service -f

์žฌ์‹œ์ž‘:

sudo systemctl restart smartfactory.service

21. MQTT ํ…Œ์ŠคํŠธ

์ „์ฒด Topic ํ™•์ธ

mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/#' \
-q 1 \
-v

์ƒ์‚ฐ ์ด๋ฒคํŠธ ์‹œ์ž‘

mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-001","scenario_id":"SCN-SF-001","command":"START_SCENARIO","target":"SMART_FACTORY","payload":{}}'

์ƒ์‚ฐ ์ด๋ฒคํŠธ ์ค‘์ง€

mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-002","scenario_id":"SCN-SF-001","command":"STOP_SCENARIO","target":"SMART_FACTORY","payload":{}}'

์ƒํƒœ ์š”์ฒญ

mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-003","scenario_id":"SCN-SF-001","command":"STATUS_REQUEST","target":"SMART_FACTORY","payload":{}}'

LED GREEN ON

mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-004","scenario_id":"SCN-SF-LED","command":"LED_ON","target":"SMART_FACTORY","payload":{}}'

LED RED ๋ณต๊ท€

mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/smartfactory/request' \
-q 1 \
-m '{"session_id":"TEST-005","scenario_id":"SCN-SF-LED","command":"LED_OFF","target":"SMART_FACTORY","payload":{}}'

22. ์ตœ์ข… ์ธํ„ฐํŽ˜์ด์Šค ์š”์•ฝ

Command

START_SCENARIO
STOP_SCENARIO
STATUS_REQUEST
LED_ON
LED_OFF

Topic

diorama/smartfactory/request
diorama/smartfactory/response
diorama/smartfactory/status
diorama/smartfactory/telemetry

MQTT ํ†ต์‹  ๊ตฌ์กฐ

Physical AI Orchestration
          โ”‚
          โ”‚ REQUEST
          โ–ผ
diorama/smartfactory/request
          โ”‚
          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚       SMART FACTORY HUB       โ”‚
โ”‚         Raspberry Pi          โ”‚
โ”‚                               โ”‚
โ”‚ START_SCENARIO                โ”‚
โ”‚ STOP_SCENARIO                 โ”‚
โ”‚ STATUS_REQUEST                โ”‚
โ”‚ LED_ON                        โ”‚
โ”‚ LED_OFF                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚       โ”‚        โ”‚
        โ–ผ       โ–ผ        โ–ผ
      LED     Large    ESP32
    Arduino  Conveyor     โ”‚
                         โ”œโ”€โ”€ Small Conveyor
                         โ””โ”€โ”€ Robot Arm
                โ”‚
                โ–ผ
        RESPONSE / STATUS
             TELEMETRY

Smart Factory๋Š” Orchestration Server์˜ MQTT ๋ช…๋ น์„ ๊ธฐ์ค€์œผ๋กœ Raspberry Pi๊ฐ€ LED Arduino, Large Conveyor Arduino ๋ฐ ACEBOTT ESP32๋ฅผ ํ†ตํ•ฉ ์ œ์–ดํ•œ๋‹ค.

์ƒ์‚ฐ ์ด๋ฒคํŠธ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” RESPONSE, ํ˜„์žฌ ์‹œ์Šคํ…œ ์ƒํƒœ๋Š” STATUS, ์ƒ์‚ฐ ๋ฐ ์šด์˜ ์ •๋ณด๋Š” TELEMETRY Topic์„ ํ†ตํ•ด Orchestration Server๋กœ ์ „๋‹ฌํ•œ๋‹ค.

Drone Center ๊ตฌํ˜„ ๋ช…์„ธ

1. ๊ฐœ์š”

Drone Station์€ Physical AI Diorama์˜ ๋“œ๋ก  ๋ฐฐ์†ก ์˜์—ญ์„ ๋‹ด๋‹นํ•œ๋‹ค.

Raspberry Pi๋ฅผ ์ค‘์‹ฌ์œผ๋กœ CoDrone Mini 1๋Œ€์™€ Arduino UNO๋ฅผ ์—ฐ๋™ํ•˜๋ฉฐ, MQTT๋ฅผ ํ†ตํ•ด Orchestration Server์™€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค.

Orchestration Server
        โ”‚
        โ”‚ MQTT REQUEST
        โ–ผ
Raspberry Pi
        โ”‚
        โ”œโ”€โ”€ CoDrone Mini
        โ”‚
        โ””โ”€โ”€ Arduino UNO
              โ”œโ”€โ”€ D6 RED LED
              โ””โ”€โ”€ D7 GREEN LED
        โ”‚
        โ”‚ MQTT STATUS / RESPONSE
        โ–ผ
Orchestration Server

2. ์‹œ์Šคํ…œ ๊ตฌ์„ฑ

๊ตฌ์„ฑ์š”์†Œ ์—ญํ• 
Raspberry Pi Drone Station ๋ฉ”์ธ ์ œ์–ด
CoDrone Mini ์‹ค์ œ ๋“œ๋ก  ๋น„ํ–‰
Arduino UNO EVENT LED ์ œ์–ด
3.5" LCD Drone Station GUI
MQTT Broker Orchestration Server ์—ฐ๋™

GUI ํ•ด์ƒ๋„:

480 ร— 320

Drone Control Python ํŒŒ์ผ:

/home/zer01ne/drone_control.py

3. MQTT Broker

Host     : jscouple.site
Port     : 1883
Username : oc
Password : 1234

Python MQTT Library:

paho-mqtt

4. MQTT Topic

Drone Station Prefix:

diorama/dronestation/
๊ตฌ๋ถ„ Topic ๋ฐฉํ–ฅ
REQUEST diorama/dronestation/request Orchestration โ†’ Drone Station
RESPONSE diorama/dronestation/response Drone Station โ†’ Orchestration
STATUS diorama/dronestation/status Drone Station โ†’ Orchestration

5. REQUEST

Topic

diorama/dronestation/request

Orchestration Server์—์„œ Drone Station EVENT ์‹คํ–‰ ๋ช…๋ น์„ ์ „๋‹ฌํ•œ๋‹ค.

START_SCENARIO

{
  "session_id": "SESSION-20261001-0001",
  "scenario_id": "SCN-DRONE-001",
  "command": "START_SCENARIO",
  "target": "DRONE",
  "payload": {
    "from": "P1",
    "to": "P2",
    "delivery_type": "MEDICINE"
  },
  "timestamp": "2026-10-01T19:46:00+09:00"
}

6. REQUEST ํ•„๋“œ ์ •์˜

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
session_id string Y Orchestration Session ID
scenario_id string Y Scenario ์‹๋ณ„ ID
command string Y ์‹คํ–‰ ๋ช…๋ น
target string Y ์ œ์–ด ๋Œ€์ƒ
payload object Y EVENT ์‹คํ–‰ ๋ฐ์ดํ„ฐ
timestamp string Y ์š”์ฒญ ์ƒ์„ฑ ์‹œ๊ฐ„

Payload ํ•„๋“œ

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…
from string ์ถœ๋ฐœ ์œ„์น˜
to string ๋„์ฐฉ ์œ„์น˜
delivery_type string ๋ฐฐ์†ก ์ข…๋ฅ˜

๋ฐฐ์†ก ์ข…๋ฅ˜:

MEDICINE
GROCERY

๊ธฐ๋ณธ ์ด๋™ ๊ตฌ๊ฐ„:

P1 โ†’ P2

7. Command

Command ์„ค๋ช…
START_SCENARIO Drone ๋ฐฐ์†ก EVENT ์‹คํ–‰

Target:

DRONE

8. EVENT ์‹œ๋‚˜๋ฆฌ์˜ค

START_SCENARIO๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ๋‹ค์Œ ์ˆœ์„œ๋กœ EVENT๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

START_SCENARIO
        โ”‚
        โ–ผ
REQUEST ๊ฒ€์ฆ
        โ”‚
        โ–ผ
RESPONSE = ACCEPTED
        โ”‚
        โ–ผ
Station = OPERATING
Progress = 10%
        โ”‚
        โ–ผ
Arduino EVENT_ON
        โ”‚
        โ”œโ”€โ”€ D6 RED   OFF
        โ””โ”€โ”€ D7 GREEN ON
        โ”‚
        โ–ผ
CoDrone TAKE OFF
        โ”‚
        โ–ผ
์ €๊ณ ๋„ ๋ณด์ •
        โ”‚
        โ–ผ
HOVER 2 SEC
        โ”‚
        โ”œโ”€โ”€ Drone = FLYING
        โ””โ”€โ”€ Progress = 65%
        โ”‚
        โ–ผ
LANDING
        โ”‚
        โ””โ”€โ”€ Progress = 90%
        โ”‚
        โ–ผ
LAND
        โ”‚
        โ–ผ
Arduino EVENT_OFF
        โ”‚
        โ”œโ”€โ”€ D6 RED   ON
        โ””โ”€โ”€ D7 GREEN OFF
        โ”‚
        โ–ผ
EVENT COMPLETE
        โ”‚
        โ”œโ”€โ”€ Station = READY
        โ”œโ”€โ”€ Drone = DOCKED
        โ”œโ”€โ”€ Progress = 100%
        โ””โ”€โ”€ Complete = TRUE
        โ”‚
        โ–ผ
RESPONSE = COMPLETE

9. EVENT ์ƒํƒœ

์ƒํƒœ ์„ค๋ช…
READY EVENT ๋Œ€๊ธฐ
TAKEOFF ๋“œ๋ก  ์ด๋ฅ™
HOVER Hover ์ˆ˜ํ–‰
LANDING ์ฐฉ๋ฅ™ ์ง„ํ–‰
COMPLETE EVENT ์™„๋ฃŒ

10. Station ์ƒํƒœ

์ƒํƒœ ์„ค๋ช…
READY EVENT ๋Œ€๊ธฐ
OPERATING EVENT ์‹คํ–‰ ์ค‘

์ƒํƒœ ๋ณ€ํ™”:

EVENT ๋Œ€๊ธฐ
READY

โ†“

EVENT ์‹คํ–‰
OPERATING

โ†“

EVENT ์™„๋ฃŒ
READY

11. Drone ์ƒํƒœ

ํ˜„์žฌ Drone Station์€ ์‹ค์ œ CoDrone Mini 1๋Œ€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋”ฐ๋ผ์„œ Drone 1, Drone 2๋กœ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  drone ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

์ƒํƒœ ์„ค๋ช…
OFFLINE Drone ์—ฐ๊ฒฐ ์•ˆ ๋จ
DOCKED Drone ์—ฐ๊ฒฐ ๋ฐ ๋Œ€๊ธฐ
FLYING Drone ๋น„ํ–‰ ์ค‘

12. STATUS

Topic

diorama/dronestation/status

์ „์†ก ์ฃผ๊ธฐ:

2 SEC

STATUS๋Š” MQTT Retained Message๋กœ ์ „์†กํ•œ๋‹ค.

STATUS Payload

{
  "device": "DRONESTATION",
  "timestamp": "2026-10-01T19:46:00+09:00",
  "station": {
    "status": "OPERATING"
  },
  "drone": {
    "status": "FLYING",
    "battery_percent": 81,
    "altitude_m": 0.23,
    "speed_mps": 0.08
  },
  "delivery": {
    "type": "MEDICINE",
    "progress_percent": 65,
    "from": "P1",
    "to": "P2",
    "complete": false
  }
}

13. STATUS ํ•„๋“œ ์ •์˜

Root

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…
device string Device ๊ตฌ๋ถ„
timestamp string ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์‹œ๊ฐ„
station object Drone Station ์ƒํƒœ
drone object Drone ์ƒํƒœ
delivery object ๋ฐฐ์†ก EVENT ์ƒํƒœ

Station

ํ•„๋“œ ํƒ€์ž… ๊ฐ’
status string READY / OPERATING

Drone

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…
status string OFFLINE / DOCKED / FLYING
battery_percent number ๋ฐฐํ„ฐ๋ฆฌ ์ž”๋Ÿ‰
altitude_m number ํ˜„์žฌ ๊ณ ๋„
speed_mps number ํ˜„์žฌ ์†๋„

Delivery

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…
type string MEDICINE / GROCERY
progress_percent integer ๋ฐฐ์†ก ์ง„ํ–‰๋ฅ 
from string ์ถœ๋ฐœ ์œ„์น˜
to string ๋„์ฐฉ ์œ„์น˜
complete boolean ๋ฐฐ์†ก ์™„๋ฃŒ ์—ฌ๋ถ€

14. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ™”๋ฉด ๋ฐ์ดํ„ฐ

ํ‘œ์‹œ ํ•ญ๋ชฉ MQTT ํ•„๋“œ ๊ฐ’
์Šคํ…Œ์ด์…˜ ์ƒํƒœ station.status READY / OPERATING
Drone ์ƒํƒœ drone.status OFFLINE / DOCKED / FLYING
๋ฐฐ์†ก ์ข…๋ฅ˜ delivery.type MEDICINE / GROCERY
๋ฐฐ์†ก ์ง„ํ–‰๋ฅ  delivery.progress_percent 0 ~ 100%
๋ฐฐํ„ฐ๋ฆฌ drone.battery_percent %
๊ณ ๋„ drone.altitude_m m
์†๋„ drone.speed_mps m/s
ํ˜„์žฌ ์œ„์น˜/๊ตฌ๊ฐ„ delivery.from โ†’ delivery.to P1 โ†’ P2
๋ฐฐ์†ก ์™„๋ฃŒ ์—ฌ๋ถ€ delivery.complete TRUE / FALSE

15. EVENT ์ง„ํ–‰๋ฅ 

EVENT ์ƒํƒœ ์ง„ํ–‰๋ฅ 
READY 0%
START 10%
HOVER 65%
LANDING 90%
COMPLETE 100%

์™„๋ฃŒ ์ƒํƒœ:

{
  "progress_percent": 100,
  "complete": true
}

16. ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ

์‹ค์ œ ์ƒํƒœ ๋ฐ์ดํ„ฐ

๋‹ค์Œ ์ •๋ณด๋Š” ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ์žฅ์น˜์˜ ์ƒํƒœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.

Station ์ƒํƒœ
Drone ์—ฐ๊ฒฐ ์ƒํƒœ
Drone ๋น„ํ–‰ ์ƒํƒœ
EVENT ์ƒํƒœ
Arduino LED ์ œ์–ด ์ƒํƒœ
MQTT ์—ฐ๊ฒฐ ์ƒํƒœ

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ

ํ˜„์žฌ CoDrone์—์„œ ์ง์ ‘ ์ทจ๋“ํ•˜์ง€ ์•Š๋Š” ๋‹ค์Œ ๊ฐ’์€ ์ „์‹œ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

Battery
Altitude
Speed

EVENT ๋Œ€๊ธฐ ์ƒํƒœ:

Altitude = 0.0 m
Speed    = 0.0 m/s

๋น„ํ–‰ ์ค‘์—๋Š” EVENT ์ƒํƒœ์— ๋งž์ถฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.


17. Arduino LED

Arduino UNO PIN ๊ตฌ์„ฑ:

PIN LED ์—ญํ• 
D6 RED READY
D7 GREEN EVENT

์ •์ƒ ๋Œ€๊ธฐ:

D6 RED   ON
D7 GREEN OFF

EVENT ์‹คํ–‰:

D6 RED   OFF
D7 GREEN ON

EVENT ์™„๋ฃŒ:

D6 RED   ON
D7 GREEN OFF

18. Arduino Serial Command

READY

READY

๊ฒฐ๊ณผ:

RED ON
GREEN OFF

EVENT_ON

EVENT_ON

๊ฒฐ๊ณผ:

RED OFF
GREEN ON

EVENT_OFF

EVENT_OFF

๊ฒฐ๊ณผ:

RED ON
GREEN OFF

Serial ํ†ต์‹  ์†๋„:

115200

Arduino UNO ์ž๋™ ๊ฒ€์ƒ‰ ๊ธฐ์ค€:

VID:PID = 2341:0043

19. RESPONSE

Topic

diorama/dronestation/response

REQUEST ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์™€ EVENT ๊ฒฐ๊ณผ๋ฅผ Orchestration Server๋กœ ์ „๋‹ฌํ•œ๋‹ค.

REQUEST ์ •์ƒ ์ ‘์ˆ˜

{
  "device": "DRONESTATION",
  "session_id": "SESSION-20261001-0001",
  "scenario_id": "SCN-DRONE-001",
  "result": "ACCEPTED",
  "event_state": "READY",
  "message": "START_SCENARIO accepted",
  "timestamp": "2026-10-01T19:46:00+09:00"
}

RESPONSE Result

Result ์„ค๋ช…
ACCEPTED EVENT ์‹คํ–‰ ์š”์ฒญ ์ •์ƒ ์ ‘์ˆ˜
BUSY ๊ธฐ์กด EVENT ์‹คํ–‰ ์ค‘
REJECTED ๋ช…๋ น ๋˜๋Š” ์‹คํ–‰ ์กฐ๊ฑด ์˜ค๋ฅ˜
ERROR REQUEST ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜
STARTED EVENT ์‹œ์ž‘
COMPLETE EVENT ์™„๋ฃŒ

20. MQTT EVENT ํ…Œ์ŠคํŠธ

ํ„ฐ๋ฏธ๋„์—์„œ Drone EVENT ์‹คํ–‰:

mosquitto_pub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/dronestation/request' \
-m '{"session_id":"SESSION-TEST-001","scenario_id":"SCN-DRONE-001","command":"START_SCENARIO","target":"DRONE","payload":{"from":"P1","to":"P2","delivery_type":"MEDICINE"},"timestamp":"2026-10-01T19:46:00+09:00"}'

21. STATUS ํ™•์ธ

mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/dronestation/status' \
-v

22. RESPONSE ํ™•์ธ

mosquitto_sub \
-h jscouple.site \
-p 1883 \
-u oc \
-P '1234' \
-t 'diorama/dronestation/response' \
-v

23. Python ์‹คํ–‰

์†Œ์Šค ์œ„์น˜:

/home/zer01ne/drone_control.py

์ผ๋ฐ˜ ์‹คํ–‰:

python3 /home/zer01ne/drone_control.py

SSH์—์„œ Raspberry Pi LCD๋กœ ์‹คํ–‰:

DISPLAY=:0 python3 /home/zer01ne/drone_control.py

24. ๋ถ€ํŒ… ์ž๋™ ์‹คํ–‰

Drone Station์€ Raspberry Pi ๋ถ€ํŒ… ์‹œ drone_control.py๊ฐ€ ์ž๋™ ์‹คํ–‰๋˜๋„๋ก systemd Service๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Service ์ด๋ฆ„:

drone-control.service

Service ํŒŒ์ผ:

/etc/systemd/system/drone-control.service

25. systemd Service ์ƒ์„ฑ

sudo nano /etc/systemd/system/drone-control.service

๋‹ค์Œ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•œ๋‹ค.

[Unit]
Description=Physical AI Drone Station Control
After=graphical.target network-online.target
Wants=network-online.target

[Service]
Type=simple
User=zer01ne
WorkingDirectory=/home/zer01ne

Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/zer01ne/.Xauthority
Environment=PYTHONUNBUFFERED=1

ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/python3 /home/zer01ne/drone_control.py

Restart=on-failure
RestartSec=5

[Install]
WantedBy=graphical.target

26. Service ๋“ฑ๋ก

systemd ์„ค์ • ๋‹ค์‹œ ์ฝ๊ธฐ:

sudo systemctl daemon-reload

๋ถ€ํŒ… ์ž๋™ ์‹คํ–‰ ํ™œ์„ฑํ™”:

sudo systemctl enable drone-control.service

Service ์‹œ์ž‘:

sudo systemctl start drone-control.service

27. Service ์ƒํƒœ ํ™•์ธ

sudo systemctl status drone-control.service

์ •์ƒ ์‹คํ–‰ ์ƒํƒœ:

Active: active (running)

28. Service ๋กœ๊ทธ ํ™•์ธ

์ตœ๊ทผ ๋กœ๊ทธ:

journalctl -u drone-control.service -n 50

์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ:

journalctl -u drone-control.service -f

์ •์ƒ MQTT ์—ฐ๊ฒฐ ์‹œ:

[MQTT] CONNECTED
[MQTT] SUBSCRIBE: diorama/dronestation/request

29. Service ์žฌ์‹œ์ž‘

Python ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•œ ํ›„:

sudo systemctl restart drone-control.service

30. Service ์ค‘์ง€

sudo systemctl stop drone-control.service

31. ์ž๋™ ์‹คํ–‰ ํ•ด์ œ

sudo systemctl disable drone-control.service

32. ๋ถ€ํŒ… ๋™์ž‘ ์ˆœ์„œ

Raspberry Pi POWER ON
        โ”‚
        โ–ผ
Linux Boot
        โ”‚
        โ–ผ
Graphical Desktop
        โ”‚
        โ–ผ
drone-control.service
        โ”‚
        โ–ผ
10 SEC WAIT
        โ”‚
        โ–ผ
drone_control.py
        โ”‚
        โ”œโ”€โ”€ 480ร—320 GUI
        โ”œโ”€โ”€ Arduino Serial
        โ”œโ”€โ”€ CoDrone Mini
        โ””โ”€โ”€ MQTT
              โ”‚
              โ–ผ
       MQTT Broker ์—ฐ๊ฒฐ
              โ”‚
              โ–ผ
diorama/dronestation/request
              โ”‚
              โ–ผ
START_SCENARIO ๋Œ€๊ธฐ

33. ์ตœ์ข… MQTT ํ†ต์‹  ๊ตฌ์กฐ

                 Orchestration Server
                        โ”‚
                        โ”‚ REQUEST
                        โ–ผ
          diorama/dronestation/request
                        โ”‚
                        โ–ผ
                  Raspberry Pi
                        โ”‚
             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
             โ”‚                     โ”‚
        Arduino UNO           CoDrone Mini
             โ”‚                     โ”‚
       โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”               โ”‚
       โ”‚           โ”‚               โ”‚
    D6 RED     D7 GREEN          Flight
     READY       EVENT
             โ”‚                     โ”‚
             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                        โ”‚
                        โ–ผ
                Drone Station
                        โ”‚
              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ”‚                   โ”‚
              โ–ผ                   โ–ผ
           STATUS              RESPONSE
              โ”‚                   โ”‚
              โ–ผ                   โ–ผ
diorama/dronestation/status
diorama/dronestation/response
              โ”‚                   โ”‚
              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                        โ–ผ
                 Orchestration Server

Hydrogen Center ๊ตฌํ˜„ ๋ช…์„ธ

1. ๊ฐœ์š”

Hydrogen / Battery Diorama๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ MQTT ๋ช…๋ น์„ ์ˆ˜์‹ ํ•˜์—ฌ Raspberry Pi์™€ Arduino๋ฅผ ํ†ตํ•ด ์ˆ˜์†Œ/๋ฐฐํ„ฐ๋ฆฌ ์ถฉ์ „ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ „์ฒด ์ œ์–ด ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Orchestration Server
        |
        | MQTT
        v
Raspberry Pi
hydrogen_control.py
        |
        | USB Serial
        v
Arduino
        |
        +-- D6 RED LED
        +-- D7 GREEN LED
        |
        +-- D5 BLUE LED
        +-- D4 BLUE LED
        +-- D3 BLUE LED
        +-- D2 BLUE LED

์ด๋ฒคํŠธ ์‹คํ–‰ ์ค‘์—๋Š” GREEN LED๊ฐ€ ์ผœ์ง€๊ณ  BLUE LED๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ๋“ฑ๋˜์–ด ์ถฉ์ „ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.


2. MQTT Topic

๊ธฐ๋ณธ Topic Prefix:

diorama/hydrogen
๊ตฌ๋ถ„ Topic ์„ค๋ช…
REQUEST diorama/hydrogen/request ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ โ†’ Hydrogen
RESPONSE diorama/hydrogen/response Hydrogen โ†’ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
STATUS diorama/hydrogen/status Hydrogen ์ƒํƒœ ์ •๋ณด ์†ก์‹ 

3. Command

Command ์„ค๋ช…
START_SCENARIO ์ˆ˜์†Œ/๋ฐฐํ„ฐ๋ฆฌ ์ถฉ์ „ ์‹œ๋‚˜๋ฆฌ์˜ค ์‹œ์ž‘
STOP_SCENARIO ์ถฉ์ „ ์‹œ๋‚˜๋ฆฌ์˜ค ์ข…๋ฃŒ
GET_STATUS ํ˜„์žฌ Hydrogen/Battery ์ƒํƒœ ์š”์ฒญ
PING ํ†ต์‹  ์ƒํƒœ ํ™•์ธ

4. REQUEST

Topic

diorama/hydrogen/request

START_SCENARIO

{
  "session_id": "SESSION-TEST-001",
  "scenario_id": "SCN-HYDROGEN-001",
  "command": "START_SCENARIO",
  "target": "HYDROGEN",
  "payload": {
    "vehicle": "CAR1"
  },
  "timestamp": "2026-10-01T19:30:00+09:00"
}

REQUEST ํ•„๋“œ ์ •์˜

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
session_id string Y ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„ธ์…˜ ID
scenario_id string Y ์‹œ๋‚˜๋ฆฌ์˜ค ์‹๋ณ„ ID
command string Y ์‹คํ–‰ ๋ช…๋ น
target string Y ๋Œ€์ƒ ๋””์˜ค๋ผ๋งˆ
payload object Y ๋ช…๋ น์— ํ•„์š”ํ•œ ์ƒ์„ธ ๋ฐ์ดํ„ฐ
timestamp string N ์š”์ฒญ ์ƒ์„ฑ ์‹œ๊ฐ„

payload

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…
vehicle string ์ถฉ์ „ ๋Œ€์ƒ ์ฐจ๋Ÿ‰ (CAR1 ๋“ฑ)

5. STOP_SCENARIO

Request

{
  "session_id": "SESSION-TEST-001",
  "scenario_id": "SCN-HYDROGEN-001",
  "command": "STOP_SCENARIO",
  "target": "HYDROGEN",
  "payload": {},
  "timestamp": "2026-10-01T19:35:00+09:00"
}

์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ถฉ์ „ ๋™์ž‘ ๋ฐ BLUE LED ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ค‘์ง€๋œ๋‹ค.


6. RESPONSE

Topic

diorama/hydrogen/response

START_SCENARIO Response

{
  "device": "HYDROGEN_BATTERY",
  "command": "START_SCENARIO",
  "result": "ACCEPTED",
  "session_id": "SESSION-TEST-001",
  "scenario_id": "SCN-HYDROGEN-001",
  "timestamp": "2026-10-01T19:30:00+09:00"
}

STOP_SCENARIO Response

{
  "device": "HYDROGEN_BATTERY",
  "command": "STOP_SCENARIO",
  "result": "COMPLETED",
  "session_id": "SESSION-TEST-001",
  "scenario_id": "SCN-HYDROGEN-001",
  "timestamp": "2026-10-01T19:35:00+09:00"
}

RESPONSE ํ•„๋“œ ์ •์˜

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…
device string ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž
command string ์ฒ˜๋ฆฌํ•œ Command
result string ๋ช…๋ น ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ
session_id string ์„ธ์…˜ ID
scenario_id string ์‹œ๋‚˜๋ฆฌ์˜ค ID
timestamp string ์‘๋‹ต ์ƒ์„ฑ ์‹œ๊ฐ„

result

๊ฐ’ ์„ค๋ช…
ACCEPTED ์‹œ๋‚˜๋ฆฌ์˜ค ์‹œ์ž‘ ๋ช…๋ น ์ •์ƒ ์ฒ˜๋ฆฌ
COMPLETED ์‹œ๋‚˜๋ฆฌ์˜ค ์ข…๋ฃŒ ๋ช…๋ น ์ •์ƒ ์ฒ˜๋ฆฌ
OK ์ผ๋ฐ˜ ๋ช…๋ น ์ •์ƒ ์ฒ˜๋ฆฌ
ARDUINO_ERROR Arduino ํ†ต์‹  ์˜ค๋ฅ˜
UNKNOWN_COMMAND ์ •์˜๋˜์ง€ ์•Š์€ Command

7. STATUS

Topic

diorama/hydrogen/status

Hydrogen/Battery Controller๋Š” ํ˜„์žฌ ์ƒํƒœ ๋ฐ ์ถฉ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋ฒ„๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์†ก์‹ ํ•œ๋‹ค.

๊ธฐ๋ณธ ์†ก์‹  ์ฃผ๊ธฐ๋Š” ์•ฝ 1์ดˆ์ด๋‹ค.

STATUS ์˜ˆ์ œ

{
  "device": "HYDROGEN_BATTERY",
  "station_status": "BUSY",
  "charging_status": "CHARGING",
  "target_vehicle": "CAR1",
  "charging_progress": 64.2,
  "vehicle_soc": {
    "start": 42.0,
    "current": 65.1,
    "target": 78.0
  },
  "hydrogen_level": 70.1,
  "supply_pressure_bar": 701.3,
  "instant_power_kw": 6.2,
  "cumulative_supply_kg": 2.37,
  "led": {
    "D6_RED": false,
    "D7_GREEN": true
  },
  "session_id": "SESSION-TEST-001",
  "scenario_id": "SCN-HYDROGEN-001",
  "timestamp": "2026-10-01T19:30:00+09:00"
}

8. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์†ก์‹  ๋ฐ์ดํ„ฐ

ํ™”๋ฉด ํ‘œ์‹œ ํ•ญ๋ชฉ MQTT ํ•„๋“œ ํƒ€์ž… ๋‹จ์œ„ ์˜ˆ์ œ
์ถฉ์ „์†Œ ์ƒํƒœ station_status string - BUSY
์ถฉ์ „ ์ƒํƒœ charging_status string - CHARGING
๋Œ€์ƒ ์ฐจ๋Ÿ‰ target_vehicle string - CAR1
์ถฉ์ „ ์ง„ํ–‰๋ฅ  charging_progress number % 64.2
์ฐจ๋Ÿ‰ ์ดˆ๊ธฐ SOC vehicle_soc.start number % 42.0
์ฐจ๋Ÿ‰ ํ˜„์žฌ SOC vehicle_soc.current number % 65.1
์ฐจ๋Ÿ‰ ๋ชฉํ‘œ SOC vehicle_soc.target number % 78.0
์ˆ˜์†Œ ์ž”๋Ÿ‰ hydrogen_level number % 70.1
๊ณต๊ธ‰ ์••๋ ฅ supply_pressure_bar number bar 701.3
์ˆœ๊ฐ„ ์ „๋ ฅ instant_power_kw number kW 6.2
๋ˆ„์  ๊ณต๊ธ‰๋Ÿ‰ cumulative_supply_kg number kg 2.37

9. ์ถฉ์ „์†Œ ์ƒํƒœ

station_status๋Š” ํ˜„์žฌ ์ถฉ์ „์†Œ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ฐ’ ์„ค๋ช…
AVAILABLE ์ถฉ์ „ ๊ฐ€๋Šฅ
BUSY ์ถฉ์ „ ์‹œ๋‚˜๋ฆฌ์˜ค ์‹คํ–‰ ์ค‘
OFFLINE Hydrogen Controller ์ข…๋ฃŒ ๋˜๋Š” ์—ฐ๊ฒฐ ํ•ด์ œ

์‹œ๋‚˜๋ฆฌ์˜ค ์‹œ์ž‘:

AVAILABLE
    |
START_SCENARIO
    |
    v
BUSY

์‹œ๋‚˜๋ฆฌ์˜ค ์ข…๋ฃŒ:

BUSY
 |
STOP_SCENARIO
 |
 v
AVAILABLE

10. ์ถฉ์ „ ์ƒํƒœ

charging_status๋Š” ์ฐจ๋Ÿ‰์˜ ํ˜„์žฌ ์ถฉ์ „ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๊ฐ’ ์„ค๋ช…
CHARGING ์ถฉ์ „ ์ง„ํ–‰ ์ค‘
COMPLETE ์ถฉ์ „ ์™„๋ฃŒ ๋˜๋Š” ์ถฉ์ „ ๋Œ€๊ธฐ ์ƒํƒœ

์‹œ๋‚˜๋ฆฌ์˜ค ์‹คํ–‰ ์ค‘:

station_status  = BUSY
charging_status = CHARGING

์‹œ๋‚˜๋ฆฌ์˜ค ์ข…๋ฃŒ ๋˜๋Š” ์ถฉ์ „ ์™„๋ฃŒ:

station_status  = AVAILABLE
charging_status = COMPLETE

11. ์ฐจ๋Ÿ‰ SOC

์ฐจ๋Ÿ‰ SOC๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๊ฐ’์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

{
  "vehicle_soc": {
    "start": 42.0,
    "current": 65.1,
    "target": 78.0
  }
}
ํ•„๋“œ ์„ค๋ช…
start ์ถฉ์ „ ์‹œ์ž‘ ์‹œ SOC
current ํ˜„์žฌ SOC
target ๋ชฉํ‘œ SOC

์ถฉ์ „ ์‹œ๋ฎฌ๋ ˆ์ด์…˜:

42%
 |
 v
50%
 |
 v
60%
 |
 v
70%
 |
 v
78%

12. LED ์ œ์–ด

Arduino Pin

Arduino Pin LED ์—ญํ• 
D2 BLUE ์ถฉ์ „ ์ง„ํ–‰ 4๋‹จ๊ณ„
D3 BLUE ์ถฉ์ „ ์ง„ํ–‰ 3๋‹จ๊ณ„
D4 BLUE ์ถฉ์ „ ์ง„ํ–‰ 2๋‹จ๊ณ„
D5 BLUE ์ถฉ์ „ ์ง„ํ–‰ 1๋‹จ๊ณ„
D6 RED IDLE / STOP
D7 GREEN RUNNING / START

13. ๊ธฐ๋ณธ LED ์ƒํƒœ

์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ:

D2 BLUE  OFF
D3 BLUE  OFF
D4 BLUE  OFF
D5 BLUE  OFF

D6 RED   ON
D7 GREEN OFF

14. ์ถฉ์ „ ์ด๋ฒคํŠธ LED

START_SCENARIO ์ˆ˜์‹  ์‹œ:

D6 RED   OFF
D7 GREEN ON

BLUE LED๋Š” ์ถฉ์ „ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ๋ˆ„์  ์ ๋“ฑ๋œ๋‹ค.

D5
 |
 v
D5 + D4
 |
 v
D5 + D4 + D3
 |
 v
D5 + D4 + D3 + D2

ํ‘œํ˜„๋˜๋Š” ์ถฉ์ „ ๋‹จ๊ณ„:

D5                  25%
D5 + D4             50%
D5 + D4 + D3        75%
D5 + D4 + D3 + D2  100%

100% ํ‘œ์‹œ ํ›„ BLUE LED๋ฅผ ๋ชจ๋‘ ๋„๊ณ  RUNNING ์ƒํƒœ์—์„œ๋Š” ๋‹ค์‹œ ๋ฐ˜๋ณตํ•œ๋‹ค.


15. STOP ๋™์ž‘

STOP_SCENARIO๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด BLUE LED ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฆ‰์‹œ ์ค‘์ง€ํ•œ๋‹ค.

D2 BLUE  OFF
D3 BLUE  OFF
D4 BLUE  OFF
D5 BLUE  OFF

D6 RED   ON
D7 GREEN OFF

16. Raspberry Pi - Arduino Serial Protocol

Serial Baudrate:

115200

Raspberry Pi -> Arduino

Command ์„ค๋ช…
START ์ถฉ์ „ ์ด๋ฒคํŠธ ์‹œ์ž‘
STOP ์ถฉ์ „ ์ด๋ฒคํŠธ ์ข…๋ฃŒ
STATUS Arduino ์ƒํƒœ ์š”์ฒญ
PING Serial ํ†ต์‹  ํ™•์ธ

Arduino -> Raspberry Pi

Message ์„ค๋ช…
READY:HYDROGEN_CONTROLLER Arduino ์ค€๋น„ ์™„๋ฃŒ
RX:START START ๋ช…๋ น ์ˆ˜์‹ 
ACK:START START ์ฒ˜๋ฆฌ ์™„๋ฃŒ
STATUS:RUNNING ์ด๋ฒคํŠธ ์‹คํ–‰ ์ค‘
RX:STOP STOP ๋ช…๋ น ์ˆ˜์‹ 
ACK:STOP STOP ์ฒ˜๋ฆฌ ์™„๋ฃŒ
STATUS:IDLE ์ด๋ฒคํŠธ ๋Œ€๊ธฐ ์ƒํƒœ
PONG PING ์‘๋‹ต
CHARGING:25 BLUE LED 25% ๋‹จ๊ณ„
CHARGING:50 BLUE LED 50% ๋‹จ๊ณ„
CHARGING:75 BLUE LED 75% ๋‹จ๊ณ„
CHARGING:100 BLUE LED 100% ๋‹จ๊ณ„

17. ์ „์ฒด ์ด๋ฒคํŠธ Flow

Orchestration Server
        |
        | START_SCENARIO
        v
MQTT Broker
        |
        v
diorama/hydrogen/request
        |
        v
Raspberry Pi
hydrogen_control.py
        |
        | Serial START
        v
Arduino
        |
        +----------------------+
        |                      |
        v                      v
D7 GREEN ON             BLUE Charging LED
                               |
                               v
                              D5
                               |
                               v
                           D5 + D4
                               |
                               v
                       D5 + D4 + D3
                               |
                               v
                  D5 + D4 + D3 + D2

Raspberry Pi
        |
        | MQTT STATUS
        v
diorama/hydrogen/status
        |
        v
Orchestration Server

18. MQTT ํ…Œ์ŠคํŠธ

์ „์ฒด Hydrogen Topic ๋ชจ๋‹ˆํ„ฐ๋ง

mosquitto_sub -h jscouple.site -p 1883 -u oc -P 1234 \
-t "diorama/hydrogen/#" -v

19. START_SCENARIO ํ…Œ์ŠคํŠธ

mosquitto_pub -h jscouple.site -p 1883 -u oc -P 1234 \
-t "diorama/hydrogen/request" \
-m '{"session_id":"SESSION-TEST-001","scenario_id":"SCN-HYDROGEN-001","command":"START_SCENARIO","target":"HYDROGEN","payload":{"vehicle":"CAR1"}}'

์ •์ƒ ๋™์ž‘:

RED OFF
GREEN ON

BLUE LED
D5 -> D5+D4 -> D5+D4+D3 -> D5+D4+D3+D2

station_status  = BUSY
charging_status = CHARGING

20. STOP_SCENARIO ํ…Œ์ŠคํŠธ

mosquitto_pub -h jscouple.site -p 1883 -u oc -P 1234 \
-t "diorama/hydrogen/request" \
-m '{"session_id":"SESSION-TEST-001","scenario_id":"SCN-HYDROGEN-001","command":"STOP_SCENARIO","target":"HYDROGEN","payload":{}}'

์ •์ƒ ๋™์ž‘:

BLUE OFF
GREEN OFF
RED ON

station_status  = AVAILABLE
charging_status = COMPLETE

21. Raspberry Pi ์‹คํ–‰ ํŒŒ์ผ

Python Controller:

/home/zer01ne/hydrogen_control.py

์‹คํ–‰:

python3 /home/zer01ne/hydrogen_control.py

22. systemd ์„œ๋น„์Šค

์„œ๋น„์Šค ํŒŒ์ผ:

/etc/systemd/system/hydrogen.service

์„œ๋น„์Šค ์„ค์ •:

[Unit]
Description=Hydrogen Battery Diorama MQTT Controller
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=zer01ne
WorkingDirectory=/home/zer01ne

ExecStart=/usr/bin/python3 /home/zer01ne/hydrogen_control.py

Restart=always
RestartSec=5

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

์„œ๋น„์Šค ๋“ฑ๋ก:

sudo systemctl daemon-reload
sudo systemctl enable hydrogen.service
sudo systemctl start hydrogen.service

์„œ๋น„์Šค ์žฌ์‹œ์ž‘:

sudo systemctl restart hydrogen.service

์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ:

sudo systemctl status hydrogen.service

์ž๋™ ์‹คํ–‰ ํ™•์ธ:

systemctl is-enabled hydrogen.service

์ •์ƒ:

enabled

์‹คํ–‰ ์ƒํƒœ ํ™•์ธ:

systemctl is-active hydrogen.service

์ •์ƒ:

active

์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ:

journalctl -u hydrogen.service -f

23. ์ตœ์ข… ์‹œ์Šคํ…œ ๊ตฌ์„ฑ

                 Orchestration Server
                         |
                         | MQTT
                         v
                  MQTT Broker
                         |
                         v
              Raspberry Pi Controller
               hydrogen_control.py
                         |
                         | USB Serial
                         v
                      Arduino
                         |
             +-----------+-----------+
             |                       |
             v                       v
       Event Status LED        Charging LED
        D6 / D7               D5/D4/D3/D2
             |
             v
      Hydrogen / Battery
          Diorama

Hydrogen / Battery Diorama๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋ฒ„์˜ MQTT ๋ช…๋ น์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถฉ์ „ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ถฉ์ „์†Œ ์ƒํƒœ, ์ถฉ์ „ ์ƒํƒœ, ๋Œ€์ƒ ์ฐจ๋Ÿ‰, ์ถฉ์ „ ์ง„ํ–‰๋ฅ , ์ฐจ๋Ÿ‰ SOC, ์ˆ˜์†Œ ์ž”๋Ÿ‰, ๊ณต๊ธ‰ ์••๋ ฅ, ์ˆœ๊ฐ„ ์ „๋ ฅ ๋ฐ ๋ˆ„์  ๊ณต๊ธ‰๋Ÿ‰์„ MQTT STATUS Topic์„ ํ†ตํ•ด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ๋‹ค.

Autonomous Center ๊ตฌํ˜„ ๋ช…์„ธ

1. ๊ฐœ์š”

Autonomous Center๋Š” Physical AI ๊ธฐ๋ฐ˜ ์ž์œจ์ฃผํ–‰ ์ฐจ๋Ÿ‰์˜ ์ด๋™ ๋ฐ ๋„๋กœ ์ƒํ™ฉ์„ ํ‘œํ˜„ํ•œ๋‹ค.

์ด 4๋Œ€์˜ ์ž์œจ์ฃผํ–‰ ์ฐจ๋Ÿ‰์„ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ธ MQTT Topic์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

CAR1
CAR2
CAR3
CAR4

2. ์ด๋ฒคํŠธ ๋ช…๋ น(Command)

Command ์„ค๋ช…
START_SCENARIO ์ž์œจ์ฃผํ–‰ ์‹œ๋‚˜๋ฆฌ์˜ค ์‹œ์ž‘
STOP_SCENARIO ์ž์œจ์ฃผํ–‰ ์‹œ๋‚˜๋ฆฌ์˜ค ์ข…๋ฃŒ
MOVE ์ฐจ๋Ÿ‰ ์ด๋™
STOP ์ฐจ๋Ÿ‰ ์ •์ง€
LED_ON ์ฐจ๋Ÿ‰ LED ์ผœ๊ธฐ โ€” ์‹ค์ œ command ๊ฐ’์€ car1_led_on (์•„๋ž˜ 2.1)
LED_OFF ์ฐจ๋Ÿ‰ LED ๋„๊ธฐ โ€” ์‹ค์ œ command ๊ฐ’์€ car1_led_off (์•„๋ž˜ 2.1)
STATUS_REQUEST ์ฐจ๋Ÿ‰ ์ƒํƒœ ์š”์ฒญ

2.1 LED_ON / LED_OFF (2026-10-09 ์ถ”๊ฐ€)

์ฐจ๋Ÿ‰ LED ์ œ์–ด. ์žฅ์น˜๋กœ ๋ณด๋‚ด๋Š” command ๊ฐ’์€ ์ฐจ ๋ฒˆํ˜ธ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ 4๋Œ€ ๋ชจ๋‘ ๊ณ ์ •์ด๋‹ค โ€” CAR2~CAR4 ์—๋„ car1_led_on / car1_led_off ๋ฅผ ๋ณด๋‚ธ๋‹ค. ์–ด๋А ์ฐจ์ธ์ง€๋Š” ํ† ํ”ฝ์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ช…๋ น ์‹ค์ œ command ๊ฐ’ (CAR1~CAR4 ๊ณตํ†ต)
LED_ON car1_led_on
LED_OFF car1_led_off

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋ฒ„(์ž๋™ํ™”ยท๋ฐฑ์˜คํ”ผ์Šค)์—์„œ๋Š” LED_ON / LED_OFF ๋กœ ๊ณ ๋ฅด๊ณ , ์„œ๋ฒ„๊ฐ€ ๋ฐœํ–‰ํ•  ๋•Œ ์œ„ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ” ๋ณด๋‚ธ๋‹ค (internal/mqttx/hub_catalog.go ์˜ HubCommand.Wire). payload ๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค ({}).

diorama/autonomouscar/car3/request
{
  "session_id": "SESSION-20260929-0005",
  "scenario_id": "SCN-AUTO-LED-001",
  "command": "car1_led_on",
  "target": "CAR3",
  "payload": {},
  "timestamp": "2026-10-09T17:00:00+09:00"
}

์‘๋‹ต์€ ๋‹ค๋ฅธ ๋ช…๋ น๊ณผ ๊ฐ™์ด diorama/autonomouscar/{car_id}/response ๋กœ ์˜จ๋‹ค๊ณ  ๋ณธ๋‹ค. ์„œ๋ฒ„๋Š” ์‘๋‹ต์˜ command ๊ฐ€ car1_led_on ์ด๋“  LED_ON ์ด๋“  (session_id, scenario_id) ๋กœ ์š”์ฒญ์„ ์ฐพ๋Š”๋‹ค. ์‘๋‹ต์ด ์—†์œผ๋ฉด ํ ํƒ€์ž„์•„์›ƒ(30์ดˆ)์œผ๋กœ ๋๋‚œ๋‹ค.


3. ํ† ํ”ฝ ๋ชฉ๋ก

๊ฐ ์ฐจ๋Ÿ‰์€ ๋‹ค์Œ Topic ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

diorama/autonomouscar/{car_id}/request
diorama/autonomouscar/{car_id}/response
diorama/autonomouscar/{car_id}/status

CAR1

diorama/autonomouscar/car1/request
diorama/autonomouscar/car1/response
diorama/autonomouscar/car1/status

CAR2

diorama/autonomouscar/car2/request
diorama/autonomouscar/car2/response
diorama/autonomouscar/car2/status

CAR3

diorama/autonomouscar/car3/request
diorama/autonomouscar/car3/response
diorama/autonomouscar/car3/status

CAR4

diorama/autonomouscar/car4/request
diorama/autonomouscar/car4/response
diorama/autonomouscar/car4/status

4. REQUEST

CAR1 Topic ์˜ˆ์‹œ

diorama/autonomouscar/car1/request

Payload ์˜ˆ์‹œ

{
  "session_id": "SESSION-20260929-0005",
  "scenario_id": "SCN-AUTO-001",
  "command": "START_SCENARIO",
  "target": "CAR1",
  "payload": {
    "from": "STATION_A",
    "to": "HYDROGEN_CENTER"
  },
  "timestamp": "2026-09-29T08:40:00+09:00"
}

REQUEST ํ•„๋“œ ์ •์˜

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช… ์˜ˆ์‹œ
session_id string Y Orchestration ์‹คํ–‰ ์„ธ์…˜ ID SESSION-20260929-0005
scenario_id string Y ์ž์œจ์ฃผํ–‰ ์‹œ๋‚˜๋ฆฌ์˜ค ID SCN-AUTO-001
command string Y ์ฐจ๋Ÿ‰ ์ œ์–ด ๋ช…๋ น START_SCENARIO
target string Y ์ œ์–ด ๋Œ€์ƒ ์ฐจ๋Ÿ‰ CAR1
payload object Y ์ฃผํ–‰ ๊ด€๋ จ Parameter (LED_ON/LED_OFF ๋Š” {}) {...}
timestamp string Y ๋ช…๋ น ์ƒ์„ฑ ์‹œ๊ฐ„ 2026-09-29T08:40:00+09:00

target ์ •์˜

๊ฐ’ ์„ค๋ช…
CAR1 ์ž์œจ์ฃผํ–‰ ์ฐจ๋Ÿ‰ 1
CAR2 ์ž์œจ์ฃผํ–‰ ์ฐจ๋Ÿ‰ 2
CAR3 ์ž์œจ์ฃผํ–‰ ์ฐจ๋Ÿ‰ 3
CAR4 ์ž์œจ์ฃผํ–‰ ์ฐจ๋Ÿ‰ 4

REQUEST Payload ์ •์˜

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช… ์˜ˆ์‹œ
from string Y ์ฐจ๋Ÿ‰ ์ถœ๋ฐœ ์œ„์น˜ STATION_A
to string Y ์ฐจ๋Ÿ‰ ๋ชฉ์ ์ง€ HYDROGEN_CENTER

5. RESPONSE

CAR1 Topic ์˜ˆ์‹œ

diorama/autonomouscar/car1/response

Payload ์˜ˆ์‹œ

{
  "session_id": "SESSION-20260929-0005",
  "scenario_id": "SCN-AUTO-001",
  "command": "START_SCENARIO",
  "target": "CAR1",
  "result": "SUCCESS",
  "message": "Autonomous driving scenario completed",
  "payload": {
    "destination_reached": true,
    "final_position": "HYDROGEN_CENTER"
  },
  "timestamp": "2026-09-29T08:40:20+09:00"
}

RESPONSE ํ•„๋“œ ์ •์˜

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
session_id string Y REQUEST์™€ ๋™์ผํ•œ Session ID
scenario_id string Y REQUEST์™€ ๋™์ผํ•œ Scenario ID
command string Y ์ฒ˜๋ฆฌํ•œ Command
target string Y ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•œ ์ฐจ๋Ÿ‰ ID
result string Y ๋ช…๋ น ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ
message string Y ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ์„ค๋ช…
payload object N ์ฃผํ–‰ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ
timestamp string Y RESPONSE ์ƒ์„ฑ ์‹œ๊ฐ„

RESPONSE Payload ์ •์˜

ํ•„๋“œ ํƒ€์ž… ์„ค๋ช…
destination_reached boolean ๋ชฉ์ ์ง€ ๋„์ฐฉ ์—ฌ๋ถ€
final_position string ์ด๋ฒคํŠธ ์ข…๋ฃŒ ์‹œ ์ฐจ๋Ÿ‰ ์œ„์น˜

Result ์ •์˜

Result ์„ค๋ช…
SUCCESS ์ฃผํ–‰ ์ด๋ฒคํŠธ ์ •์ƒ ์™„๋ฃŒ
FAILED ์ฃผํ–‰ ์ด๋ฒคํŠธ ์‹คํŒจ
BUSY ์ฐจ๋Ÿ‰์ด ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์ˆ˜ํ–‰ ์ค‘
INVALID_COMMAND ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ช…๋ น
DEVICE_ERROR ์ฐจ๋Ÿ‰ ๋˜๋Š” ์ œ์–ด ์žฅ์น˜ ์˜ค๋ฅ˜

6. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์†ก์‹  ์ •๋ณด

Topic

diorama/autonomouscar/{car_id}/status

CAR1 ~ CAR4๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ž์‹ ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ Orchestration Server๋กœ ์†ก์‹ ํ•œ๋‹ค.

ํ•„๋“œ ํƒ€์ž… ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜ ์„ค๋ช…
vehicle_id string System CAR1 ~ CAR4
status string System IDLE, DRIVING, STOPPED, ARRIVED, ERROR
autopilot boolean System ์ž์œจ์ฃผํ–‰ ํ™œ์„ฑํ™” ์—ฌ๋ถ€
speed number Vehicle/Simulation ํ˜„์žฌ ์†๋„ km/h
battery number Vehicle/Simulation ์ฐจ๋Ÿ‰ ๋ฐฐํ„ฐ๋ฆฌ %
traffic string Simulation LOW, NORMAL, HIGH
current_position string System/Simulation ํ˜„์žฌ ์œ„์น˜
destination string System ๋ชฉ์ ์ง€
progress number Simulation ์ด๋™ ์ง„ํ–‰๋ฅ  %
estimated_time number Simulation ๋ชฉ์ ์ง€๊นŒ์ง€ ์˜ˆ์ƒ ์‹œ๊ฐ„(sec)
distance_remaining number Simulation ์ž”์—ฌ ๊ฑฐ๋ฆฌ
climate_control boolean Simulation ๊ณต์กฐ ์‹œ์Šคํ…œ ๋™์ž‘ ์—ฌ๋ถ€
event_led string Arduino Station ์ด๋ฒคํŠธ LED
destination_reached boolean System ๋ชฉ์ ์ง€ ๋„์ฐฉ ์—ฌ๋ถ€
scenario_id string System Scenario ID
timestamp string System ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์‹œ๊ฐ„

STATUS Payload ์˜ˆ์‹œ

{
  "vehicle_id": "CAR1",
  "status": "DRIVING",
  "autopilot": true,
  "speed": 32.5,
  "battery": 78,
  "traffic": "NORMAL",
  "current_position": "ROAD_A",
  "destination": "HYDROGEN_CENTER",
  "progress": 62,
  "estimated_time": 35,
  "distance_remaining": 1.8,
  "climate_control": true,
  "event_led": "GREEN",
  "destination_reached": false,
  "scenario_id": "SCN-AUTO-001",
  "timestamp": "2026-09-29T08:40:10+09:00"
}

7. QoS / ๊ธฐํƒ€ ์„ค์ •

ํ•ญ๋ชฉ ์„ค์ •
REQUEST QoS 1
RESPONSE QoS 1
STATUS QoS 1
REQUEST Retain false
RESPONSE Retain false
STATUS Retain true
Payload JSON
Encoding UTF-8
Vehicle CAR1 ~ CAR4
Traffic Data Simulation
Speed Vehicle/Simulation
Battery Vehicle/Simulation

์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋ฒ„ ๊ตฌํ˜„ ๋ฉ”๋ชจ (2026-10-01)

์œ„ ๋‹ค์„ฏ ๊ตฌ์—ญ ๋ช…์„ธ๋ฅผ ์„œ๋ฒ„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ›์•„ ์“ฐ๋Š”์ง€. ํ—ˆ๋ธŒ ํŒ€์ด ๋ฌธ์„œ๋ฅผ ๊ณ ์น˜๋ฉด ์„œ๋ฒ„๋„ ์—ฌ๊ธฐ๋ฅผ ๋ณด๊ณ  ๋”ฐ๋ผ๊ฐ„๋‹ค.

ํ•ญ๋ชฉ ์„œ๋ฒ„ ๋™์ž‘
๊ตฌ์—ญ ์ •์˜ internal/mqttx/hub_catalog.go ๊ฐ€ targetยท์Šฌ๋Ÿฌ๊ทธยทcommandยทpayload ํ‘œ๋ฅผ ๋“ค๊ณ  ์žˆ๊ณ , ๋ฐฑ์˜คํ”ผ์Šค๋Š” GET /api/admin/hub/catalog ๋กœ ๊ฐ™์€ ํ‘œ๋ฅผ ๋ฐ›์•„ ์ž…๋ ฅ ํผ์„ ๋งŒ๋“ ๋‹ค
ํ ๊ตฌ์—ญ๋งˆ๋‹ค ๋”ฐ๋กœ (hub:{์Šฌ๋Ÿฌ๊ทธ}). ๋“œ๋ก ์ด ๋ฐฐ์†กํ•˜๋Š” ๋™์•ˆ ํŠธ๋ฆฌ LED ๋ฅผ ์ผค ์ˆ˜ ์žˆ๊ณ , ๊ฐ™์€ ๊ตฌ์—ญ ์•ˆ์—์„œ๋Š” ์ˆœ์„œ๊ฐ€ ์ง€์ผœ์ง„๋‹ค
scenario_id ๋น„์–ด ์žˆ์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ uuid ๋ฅผ ๋งŒ๋“ค์–ด ์ฑ„์šด๋‹ค. ์‘๋‹ต ๋งค์นญ ํ‚ค๊ฐ€ (session_id, scenario_id, command) ๋ผ, ๋น„์›Œ ๋‘๋ฉด ๊ฐ™์€ ์„ธ์…˜์˜ ๊ฐ™์€ command ๋‘ ๊ฑด์ด ๊ฐ™์€ ํ‚ค๊ฐ€ ๋œ๋‹ค
payload ๋ฌธ์„œ์ƒ ํ•„์ˆ˜ object ๋ผ, ๋ณด๋‚ผ ๊ฐ’์ด ์—†์œผ๋ฉด {} ๋ฅผ ๋ณด๋‚ธ๋‹ค
target ์˜› ์ด๋ฆ„(NEURAL_TREEยทFACTORYยทDRONE_STATION ๋“ฑ)๋„ ๊ณ„์† ๋ฐ›์•„ ์ •์‹ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ” ๋ฐœํ–‰ํ•œ๋‹ค
result SUCCESS ๋งŒ ์„ฑ๊ณต์œผ๋กœ ์น˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์‹คํŒจ๋กœ ์ข…๊ฒฐํ•œ๋‹ค. ๋‹ค๋งŒ FAILEDยทBUSYยทINVALID_COMMANDยทDEVICE_ERROR ๋ฅผ ๋ญ‰๊ฐœ์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์‹คํ–‰ ๋กœ๊ทธ์™€ ํ™”๋ฉด์— ๋‚จ๊ธด๋‹ค โ€” ์Šคํƒœํ”„๊ฐ€ ํ•  ์ผ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜› FAIL ๋„ ๋ฐ›๋Š”๋‹ค
์‘๋‹ต payload ๊ตฌ์—ญ๋งˆ๋‹ค ํ•„๋“œ๊ฐ€ ๋‹ฌ๋ผ ์„œ๋ฒ„๋Š” ํ•ด์„ํ•˜์ง€ ์•Š๊ณ  ์›๋ฌธ ๊ทธ๋Œ€๋กœ ๋กœ๊ทธยทํ™”๋ฉด์— ๋‚จ๊ธด๋‹ค
ํƒœ๋ธ”๋ฆฟ ์ „๋‹ฌ (hub_mode, 149ยท150) ์„œ๋ฒ„๊ฐ€ ๋ฐ›์€ diorama/{device}/status ๋ฅผ orchestration/diorama/{device}/status ๋กœ ๊ทธ๋Œ€๋กœ ๋ฆด๋ ˆ์ดํ•œ๋‹ค(mirror, ๊ธฐ๋ณธ). app_settings.hub_mode๋ฅผ simulate ๋กœ ๋ฐ”๊พธ๋ฉด, hub ์ž๋™ํ™” ์•ก์…˜์„ ๋ฐœํ–‰ํ•˜๋Š” ์‹œ์ ์— ์–ด๋“œ๋ฏผ์ด ๋ฐฑ์˜คํ”ผ์Šค(GETยทPUTยทDELETE /api/admin/hub/simulated-responses)์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋‘” (target, command) โ†’ ์ƒํƒœ JSON์„ ๊ทธ๋Œ€๋กœ ๊ฐ™์€ ํ† ํ”ฝ์œผ๋กœ ์ฆ‰์‹œ ๋‚ด๋ณด๋‚ธ๋‹ค โ€” ํ—ˆ๋ธŒ ํ•˜๋“œ์›จ์–ด๊ฐ€ ๋ถˆ์•ˆ์ •ํ•ด ์‹ค์ œ ์‘๋‹ต์ด ์˜ค์ง€ ์•Š์•„๋„ ํƒœ๋ธ”๋ฆฟ ํ™”๋ฉด์€ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค. ์ €์žฅ๋œ ์กฐํ•ฉ์ด ์—†์œผ๋ฉด simulate ๋ผ๋„ ์•„๋ฌด ๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค. ๊ฐ€์ƒ ์‘๋‹ต์„ ์ €์žฅํ•ด ๋‘” ์žฅ์น˜(target)๋Š” simulate ์—์„œ ์‹ค์ œ ํ—ˆ๋ธŒ status ๋ฅผ ๋ฆด๋ ˆ์ดํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ํ—ˆ๋ธŒ๊ฐ€ 2์ดˆ๋งˆ๋‹ค ๋ณด๋‚ด๋Š” ์‹ค์ œ ์ƒํƒœ๊ฐ€ ๊ฐ€์ƒ ์ƒํƒœ๋ฅผ ๋ฎ์–ด์จ์„œ(2026-10-09). ์ €์žฅํ•˜์ง€ ์•Š์€ ์žฅ์น˜๋Š” simulate ์—ฌ๋„ ์‹ค์ œ ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฆด๋ ˆ์ดํ•œ๋‹ค

status ์˜ connection ์€ online/offline ๋กœ ๋ณด๋‚ด์ฃผ์„ธ์š”. ๋ฐฑ์˜คํ”ผ์Šค๊ฐ€ ์ด ๊ฐ’์œผ๋กœ ๋ธŒ๋ฆฌ์ง€ ํ”„๋กœ์„ธ์Šค์˜ ์ƒ์‚ฌ(LWT)๋ฅผ ํŒ์ •ํ•ฉ๋‹ˆ๋‹ค. Arduino ์—ฐ๊ฒฐ ์—ฌ๋ถ€๋Š” serial(connected/disconnected) ํ•„๋“œ๋กœ ๋”ฐ๋กœ ๋ด…๋‹ˆ๋‹ค โ€” ๋ฌธ์„œ 6์ ˆ ํ‘œ์˜ "Arduino ์—ฐ๊ฒฐ ์ƒํƒœ" ๋Š” ์ด serial ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.