첫 번째 앱 구축
이 가이드는 엣지 디바이스에서 데이터를 수집하여 실시간 대시보드에 표시하는 IronFlock 앱을 구축하는 일반적인 워크플로우를 안내합니다. 이 과정을 마치면 데이터 모델, 엣지 로직, 사용자용 구성 양식, 라이브 차트 — 모두 프로젝트 데이터베이스를 통해 연결된 — 가 완성됩니다.
1. 데이터 모델 설계
.ironflock/data-template.yml 파일에서 시작합니다. 두 가지 테이블 카테고리를 고려하십시오:
- 엔티티 테이블 — 사물의 현재 상태를 추적합니다 (디바이스, 기계, 연결). 변경 시마다 행을 추가하고,
maintainLatestFlagFor가 어떤 컬럼이 엔티티를 식별하는지 선언하므로 필요할 때 엔티티별 최신 행을 조회할 수 있습니다. - 시계열 테이블 — 시간에 따른 측정값을 수집합니다 (센서 판독값, 메트릭). 모든 행은 타임스탬프가 있는 새 데이터 포인트입니다.
data:
tables:
# 엔티티 테이블: 디바이스당 하나의 행, 최신 상태 항상 조회 가능
- tablename: devices
maintainLatestFlagFor: ['device_key']
columns:
- id: tsp
dataType: timestamp
- id: device_key
dataType: string
- id: status
dataType: string
- id: device_name
dataType: string
- id: deleted
dataType: boolean
# 엔티티 테이블: 사용자가 구성한 Modbus 서버
- tablename: modbus_servers
maintainLatestFlagFor: ['server_id']
columns:
- id: tsp
dataType: timestamp
- id: server_id
dataType: string
- id: host
dataType: string
- id: port
dataType: numeric
- id: deleted
dataType: boolean
# 시계열 테이블: 연결된 하드웨어의 주기적 판독값
- tablename: readings
columns:
- id: tsp
dataType: timestamp
- id: server_id
dataType: string
- id: metric
dataType: string
- id: value
dataType: numeric2. 테스트 환경 설정
앱을 테스트하려면 온라인 디바이스가 하나 이상 있는 프로젝트의 개발 환경이 필요합니다:
- 앱 상세 페이지에서 Develop를 클릭하여 클라우드 IDE를 엽니다.
- 접근 권한이 있는 프로젝트의 온라인 디바이스를 선택합니다.
- 사이드 패널에서 Create Backend를 클릭하여 해당 프로젝트의 데이터베이스에 개발 환경을 생성합니다.
이렇게 하면 data-template.yml에 정의된 테이블이 프로젝트의 데이터베이스에 인스턴스화됩니다. 프로젝트의 Fleet Database 뷰에서 이를 확인할 수 있습니다.
클라우드 IDE는 파일 탐색기, 편집기, 터미널, 디바이스에 빌드 및 배포를 위한 엣지 개발 패널이 있는 전체 VS Code 환경을 제공합니다.
3. 엣지 코드 작성
Docker 컨테이너가 디바이스에서 실행되며 IronFlock SDK를 사용하여 프로젝트 데이터베이스와 상호작용합니다.
시작 시 디바이스 등록
엣지 컴포넌트가 시작될 때 devices 엔티티 테이블에 행을 추가하여 대시보드가 디바이스 온라인 상태를 알 수 있도록 합니다:
Python
import asyncio
from ironflock import IronFlock
async def main():
# 이 디바이스를 온라인으로 등록
await flock.append_to_table("devices", {
"device_key": os.environ.get('DEVICE_KEY'),
"tsp": now,
"status": "online",
"device_name": os.environ.get('DEVICE_NAME'),
"deleted": False
})
# ... 나머지 로직
flock = IronFlock(mainFunc=main)
flock.run()devices가 maintainLatestFlagFor: ['device_key']를 사용하기 때문에 이 디바이스의 이전 상태 행이 자동으로 교체됩니다. latest 필터가 활성화된 위젯은 항상 현재 상태를 표시합니다.
사용자 구성에 반응
사용자는 보드의 양식을 통해 Modbus 서버를 추가할 수 있습니다(4단계 참조). 엣지 코드는 modbus_servers 테이블을 구독하고 새 항목에 반응합니다:
Python
async def main():
# ... 디바이스 등록 ...
# 기존 Modbus 서버 읽기
existing = await flock.getHistory("modbus_servers", {
"limit": 1000,
"filterAnd": [
# "latest": True는 server_id별 최신 행만 반환합니다
{"latest": True},
{"column": "deleted", "operator": "IS", "value": None}
]
})
for server in existing:
create_modbus_connection(server)
# 실시간으로 새 서버에 반응
def on_server_change(*args, **kwargs):
server = args[0] if args else kwargs
if server.get("deleted"):
delete_modbus_connection(server["server_id"])
else:
create_modbus_connection(server)
await flock.subscribe_to_table("modbus_servers", on_server_change)시계열 데이터 수집
Modbus 연결이 설정되면 주기적으로 폴링하고 판독값을 readings 테이블에 씁니다:
Python
async def modbus_poll_loop(server_id, client):
while True:
values = client.read_registers()
for metric, value in values.items():
await flock.publish_to_table("readings", {
"server_id": server_id,
"metric": metric,
"value": value
})
await asyncio.sleep(5)4. 보드 구축
보드 에디터를 열고 데이터 백엔드 테이블에 연결된 위젯을 추가합니다.
디바이스 상태 표시
devices 테이블에 연결된 Table 위젯을 추가합니다. 위젯의 필터 설정에서 latest 토글을 켜면 항상 각 디바이스의 현재 상태를 표시합니다. 디바이스가 온라인 또는 오프라인이 될 때 테이블이 자동으로 업데이트됩니다.
사용자가 Modbus 서버를 구성하도록 허용
modbus_servers 테이블에 연결된 Form 위젯을 추가합니다. host 및 port에 대한 필드를 구성합니다. 사용자가 양식을 작성하고 제출하면 새 행이 modbus_servers 테이블에 자동으로 삽입됩니다 — 양식 제출을 처리하는 백엔드 코드가 필요 없습니다.
엣지 코드가 subscribeToTable을 통해 새 행을 감지하고(3단계 참조) Modbus 연결을 설정합니다.
시계열 데이터 시각화
readings 테이블에 연결된 Line Chart 위젯을 추가합니다. tsp를 X축에, value를 Y축에 매핑합니다. 디바이스에서 새 판독값이 도착하면 차트가 실시간으로 업데이트됩니다 — 폴링이나 수동 새로 고침이 필요 없습니다.
전체 구조
┌─────────────────────────────────────────────────────────┐
│ 보드 (대시보드) │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ 테이블 │ │ 양식 │ │ 라인 차트 │ │
│ │ devices │ │ modbus_servers │ │ readings │ │
│ └────┬─────┘ └──────┬───────┘ └────────┬──────────┘ │
│ │ │ │ │
└───────┼───────────────┼───────────────────┼─────────────┘
│ │ │
┌────▼───────────────▼───────────────────▼────┐
│ 프로젝트 데이터베이스 │
│ devices │ modbus_servers │ readings │
└────▲───────────────▲───────────────────▲────┘
│ │ │
┌────┴───────────────┴───────────────────┴────┐
│ 엣지 코드 (디바이스에서) │
│ 디바이스 등록 → 구성 읽기 → 데이터 폴링 │
└─────────────────────────────────────────────┘프로젝트 데이터베이스가 단일 진실 소스입니다. 엣지 코드가 여기에 쓰고, 보드가 실시간으로 읽고, 양식을 통한 사용자 작업이 다시 여기에 씁니다. 엣지 코드가 이러한 변경 사항을 구독하여 루프를 완성합니다 — 커스텀 API 엔드포인트가 필요 없습니다.
팁
- 엔티티 테이블부터 시작하세요. 시계열 수집을 추가하기 전에 디바이스 등록과 상태 테이블을 먼저 완성하십시오.
- 현재 상태 조회가 필요한 테이블에는
maintainLatestFlagFor를 사용하세요. 이력을 추가하면서도 추가 코드 없이 엔티티별 최신 행을 조회할 수 있습니다 — 위젯의 latest 토글을 켜거나 SDK 필터에{"latest": true}를 넣으면 됩니다. - 사용자가 양식으로 관리하는 엔티티 테이블에는
deleted컬럼을 추가하세요. 이력을 보존하면서 레코드를 소프트 삭제할 수 있습니다. - 확인이 필요한 쓰기에는
appendToTable을 사용하세요 (예: 초기 디바이스 등록). 고주파 텔레메트리에는 fire-and-forget 방식이 허용될 때publishToTable을 사용하세요. - 시계열 테이블은 단순하게 유지하세요. 타임스탬프 하나, 소스 식별자, 측정값으로 구성합니다. 집계는 변환 테이블을 사용하세요.
다음 단계
하드웨어가 웹 기반 HMI 또는 구성 인터페이스를 노출하는 경우 Embed 위젯과 디바이스 터널을 사용하여 IronFlock 보드에 직접 임베드할 수 있습니다. 자세한 내용은 외부 HMI 임베드를 참조하십시오.